多个jsons到csv

时间:2016-09-14 15:27:20

标签: python json excel csv

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

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); });

subject.onNext(1);
// => onNext: 1

subject.onNext(2);
// => onNext: 2

subject.onCompleted();
// => onCompleted

subscription.dispose();

它们实际上是行,我只是用这种方式写它们以获得更多可见性。

我的问题如下:

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

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

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

此示例的可能csv输出将包含以下列:

{
"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"
                       }
                     ]
                 }
           }
       }
}

欢迎任何想法/参考:)

由于

2 个答案:

答案 0 :(得分:1)

请检查此(python3)解决方案是否适合您。

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

答案 1 :(得分:1)

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

但是,您可以编写一个执行此操作的Python程序。

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

  • 命令行上可能需要多个文件。
  • 每个文件假定每行有一个JSON对象。
  • 它使JSON对象变平,用“。”
  • 连接标签

x