I wrote a lil tool to convert CSV to JSON. Seems to work but no guarantees, it’s 03:24 AM.
parent
df66ad4d42
commit
1b3df06bf6
|
@ -0,0 +1,99 @@
|
|||
import json, sys, os, csv
|
||||
|
||||
infile = ""
|
||||
outfile = ""
|
||||
separator = ","
|
||||
quote = '"'
|
||||
|
||||
nofirstrow = False
|
||||
|
||||
EXIT_SUCCESS=0
|
||||
EXIT_USAGE=1
|
||||
EXIT_RUNTIME=2
|
||||
|
||||
if len(sys.argv)<2 or len(sys.argv)>3:
|
||||
sys.stderr.write(
|
||||
"Usage: "+sys.argv[0]+""" INFILE [OUTFILE]
|
||||
|
||||
INFILE: input file, CSV
|
||||
OUTFILE (optional): output file, JSON
|
||||
|
||||
Environment Variables:
|
||||
|
||||
SEPARATOR: field delimiter, default comma
|
||||
QUOTE: used to quote strings containing SEPARATOR, default '"'
|
||||
NOFIRSTROW: true or false, disables using the first row as table headers,
|
||||
default false
|
||||
"""
|
||||
)
|
||||
sys.stderr.flush()
|
||||
sys.exit(EXIT_USAGE)
|
||||
|
||||
if os.path.isfile(sys.argv[1]):
|
||||
infile = sys.argv[1]
|
||||
else:
|
||||
print("Not a file: "+sys.argv[1], file=sys.stderr)
|
||||
sys.exit(EXIT_RUNTIME)
|
||||
|
||||
# manually specified name
|
||||
if len(sys.argv)>2:
|
||||
# check if parent directory of specified file exists
|
||||
if os.path.isdir(os.path.abspath(os.path.join(sys.argv[2], os.pardir))):
|
||||
outfile = sys.argv[2]
|
||||
else:
|
||||
print("Missing parent dir for: "+sys.argv[2], file=sys.stderr)
|
||||
sys.exit(EXIT_RUNTIME)
|
||||
|
||||
# attempt to automatically determine name
|
||||
else:
|
||||
if len(sys.argv[1])>4 and sys.argv[1][-4:]==".csv":
|
||||
outfile = sys.argv[1][:-4]+".json"
|
||||
else:
|
||||
print("Cannot automatically determine destination file name for: "+sys.argv[1], file=sys.stderr)
|
||||
sys.exit(EXIT_RUNTIME)
|
||||
if os.path.exists(outfile):
|
||||
print("Destination file exists, refusing to operate: "+outfile, file=sys.stderr)
|
||||
print("To overwrite, explicitly specify destination filename on the command line.")
|
||||
sys.exit(EXIT_RUNTIME)
|
||||
|
||||
separator = os.environ.get("SEPARATOR", ",")
|
||||
if len(separator)>1:
|
||||
print("Warning: Separator from environment appears to be longer than one character. This might cause issues.")
|
||||
|
||||
quote = os.environ.get("QUOTE", '"')
|
||||
if len(quote)>1:
|
||||
print("Warning: Quote from environment appears to be longer than one character. This might cause issues.")
|
||||
|
||||
if os.environ.get("NOFIRSTROW", "false").lower() == "false":
|
||||
nofirstrow = False
|
||||
elif os.environ["NOFIRSTROW"].lower() == "true":
|
||||
nofirstrow = True
|
||||
else:
|
||||
print("Environment variable NOFIRSTROW is set but neither true nor false.", file=sys.stderr)
|
||||
sys.exit(EXIT_USAGE)
|
||||
|
||||
infileobject = open(infile, "r")
|
||||
csvreader = csv.reader(infileobject, delimiter=separator, quotechar=quote)
|
||||
|
||||
columns = []
|
||||
rows = []
|
||||
for row in csvreader:
|
||||
if columns == []:
|
||||
# assume we are reading the first row
|
||||
if nofirstrow:
|
||||
columns = list(range(len(row)))
|
||||
else:
|
||||
columns = row
|
||||
continue
|
||||
|
||||
rows = rows + [{}]
|
||||
|
||||
i = 0
|
||||
while i<len(columns):
|
||||
rows[-1][columns[i]] = row[i]
|
||||
i = i+1
|
||||
|
||||
infileobject.close()
|
||||
|
||||
outfileobject = open(outfile, "w");
|
||||
outfileobject.write(json.dumps(rows))
|
Loading…
Reference in New Issue