多个jsons到csv

我有多个文件,每个文件包含多个高度嵌套的json 。 一个这样的文件的两个第一行看起来像:

{ "u":"28", "evv":{ "w":{ "1":400, "2":{ "i":[{ "l":14, "c":"7", "p":"4" } ] } } } } { "u":"29", "evv":{ "w":{ "3":400, "2":{ "i":[{ "c":14, "y":"7", "z":"4" } ] } } } } 

他们实际上是行,我只是这样写在这里更多的可见性。

我的问题如下:

有没有办法将所有这些文件转换为一个(或多个,即每个文件一个)csv / excel …?

有什么简单的方法,不需要写几十或数百行Python,特定于我的文件,将所有这些文件转换为一个(或多个,即每个文件一个)csv / excel …? 一个例子是使用外部库,脚本…处理这个特定的任务,不pipe字段的名称。

陷阱是一些元素不会出现在每一行中。 例如,对于“i”键,在第一个json中有3个字段(l,c,p),在第二个字段(c,y,z)中有3个字段。 理想情况下,csv应该包含尽可能多的列(例如evv.w.2.il,evv.w.2.ic,evv.w.2.ip,evv.w.2.iy,evv.w. 2.iz)每csv行有(很多)空值的风险。

本例中可能的csv输出将包含以下列:

 u, evv.w.1, evv.w.3, evv.w.2.il, evv.w.2.ic, evv.w.2.ip, evv.w.2.iy, evv.w.2.iz 

任何想法/参考是欢迎:)

谢谢

不,没有一个通用的程序可以完全满足你的要求。

但是,你可以写一个Python程序来完成它。

这个程序可能会做你想要的。 它没有特定于您的密钥名称的任何代码,但它是特定于您的文件格式。

  • 它可以在命令行上使用几个文件。
  • 每个文件被假定为每行有一个JSON对象。
  • 它使JSON对象变平,用“。”连接标签。
 import fileinput import json import csv def flattify(d, key=()): if isinstance(d, list): result = {} for i in d: result.update(flattify(i, key)) return result if isinstance(d, dict): result = {} for k, v in d.items(): result.update(flattify(v, key + (k,))) return result return {key: d} total = [] for line in fileinput.input(): if(line.strip()): line = json.loads(line) line = flattify(line) line = {'.'.join(k): v for k, v in line.items()} total.append(line) keys = set() for d in total: keys.update(d) with open('result.csv', 'w') as output_file: output_file = csv.DictWriter(output_file, sorted(keys)) output_file.writeheader() output_file.writerows(total) 

请检查这个(python3)解决scheme是否适合你。

 import json import csv with open('test.json') as data_file: with open('output.csv', 'w', newline='') as fp: for line in data_file: data = json.loads(line) output = [[data['u'], data['evv']['w'].get('1'), data['evv']['w'].get('3'), data['evv']['w'].get('2')['i'][0].get('l'), data['evv']['w'].get('2')['i'][0].get('c'), data['evv']['w'].get('2')['i'][0].get('p'), data['evv']['w'].get('2')['i'][0].get('y'), data['evv']['w'].get('2')['i'][0].get('z')]] a = csv.writer(fp, delimiter=',') a.writerows(output) 

test.json

 { "u": "28", "evv": { "w": { "1": 400, "2": { "i": [{ "l": 14, "c": "7", "p": "4" }] } } }} {"u":"29","evv":{ "w":{ "3":400, "2":{ "i":[{ "c":14, "y":"7", "z":"4" } ] } } }} 

产量

 python3 pyprog.py dac@dac-Latitude-E7450 ~/P/pyprog> more output.csv 28,400,,14,7,4,, 29,,400,,14,,7,4