From a032b6862b04f59498b39eb7c9dc494be6c233b0 Mon Sep 17 00:00:00 2001 From: James Hartt Date: Wed, 11 Oct 2017 09:46:58 +0100 Subject: [PATCH] Add custom delimiter option --- README.md | 4 ++++ json2csv.py | 8 +++++--- tests.py | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 40bec3c..5c13a1c 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ For MongoDB (multiple JSON objects per file, which is non-standard JSON): python json2csv.py --each-line /path/to/json_file.json /path/to/outline_file.json +For custom CSV delimiter output: + + python json2csv.py /path/to/json_file.json /path/to/outline_file.json --csv-delimiter ';' + ## Outline Format For this JSON file: diff --git a/json2csv.py b/json2csv.py index e70ef12..e10eefb 100755 --- a/json2csv.py +++ b/json2csv.py @@ -90,7 +90,7 @@ def make_string(self, item): else: return unicode(item) - def write_csv(self, filename='output.csv', make_strings=False): + def write_csv(self, filename='output.csv', make_strings=False, delimiter=','): """Write the processed rows to the given filename """ if (len(self.rows) <= 0): @@ -100,7 +100,7 @@ def write_csv(self, filename='output.csv', make_strings=False): else: out = self.rows with open(filename, 'wb+') as f: - writer = csv.DictWriter(f, self.key_map.keys()) + writer = csv.DictWriter(f, self.key_map.keys(), delimiter=delimiter) writer.writeheader() writer.writerows(out) @@ -131,6 +131,8 @@ def init_parser(): help="Path to csv file to output") parser.add_argument( '--strings', help="Convert lists, sets, and dictionaries fully to comma-separated strings.", action="store_true", default=True) + parser.add_argument('--csv-delimiter', type=str, default=',', + help="Delimiter for csv output") return parser @@ -152,4 +154,4 @@ def init_parser(): fileName, fileExtension = os.path.splitext(args.json_file.name) outfile = fileName + '.csv' - loader.write_csv(filename=outfile, make_strings=args.strings) + loader.write_csv(filename=outfile, make_strings=args.strings, delimiter=args.csv_delimiter) diff --git a/tests.py b/tests.py index 821e4c3..a317b1a 100644 --- a/tests.py +++ b/tests.py @@ -2,7 +2,7 @@ import json from json2csv import Json2Csv, MultiLineJson2Csv from gen_outline import make_outline - +import os class TestJson2Csv(unittest.TestCase): @@ -115,6 +115,41 @@ def test_load_bare_json(self): def test_write_csv(self): pass + def test_custom_delimiter(self): + outline = {"map": [['author', 'source.author'], ['message', 'message.original']], "collection": "nodes"} + loader = Json2Csv(outline) + with open('fixtures/data.json') as f: + loader.load(f) + + filename = "test.csv" + loader.write_csv(filename=filename, delimiter=';') + output = open(filename, "r") + csvString = output.read() + + author = 'author' + delimiterSubstring = csvString[len(author):len(author)+1] + + self.assertEqual(delimiterSubstring, ';') + + os.remove(filename) + + def test_default_delimiter(self): + outline = {"map": [['author', 'source.author'], ['message', 'message.original']], "collection": "nodes"} + loader = Json2Csv(outline) + with open('fixtures/data.json') as f: + loader.load(f) + + filename = "test.csv" + loader.write_csv(filename=filename) + output = open(filename, "r") + csvString = output.read() + + author = 'author' + delimiterSubstring = csvString[len(author):len(author)+1] + + self.assertEqual(delimiterSubstring, ',') + + os.remove(filename) class TestMultiLineJson2Csv(unittest.TestCase):