如何将复杂的嵌套json转换为csv

时间:2019-07-20 17:07:20

标签: json csv command-line jq

这是输入json

{
    "step": 1,
    "inputs": {
        "first_input": {
            "file_id": "xxx"
        }
        "second_input": 3
    }
}
{
    "step": 2,
    "inputs": {
        "my_first_arg": {
            "file_id": "yyy"
        }
        "my_second_arg": 0
    }
}

所需的csv文件是

1,first_input,"xxx"
1,second_input,3
2,my_first_arg:"yyy"
2,my_second_arg,0

这里的挑战是每个inputs字段都包含一个具有不同键名和值类型的字典。基本上,我想要step字段的值,inputs的所有键以及inputs的值的子节点,但要让相关数据保留在csv的同一行中。 / p>

2 个答案:

答案 0 :(得分:2)

要生成所需值的数组:

.step as $step
| .inputs
| to_entries[]
| .key as $key
| [$step, .key]
  + (.value | if type=="object" then to_entries[] | [.key, .value] else [$key, .] end)

最后加上@csv会产生CSV值,且数字未加引号。 使用-r命令行选项并对样本输入进行较小的校正将产生:

1,"first_input","file_id","xxx"
1,"second_input","second_input",3
2,"my_first_arg","file_id","yyy"
2,"my_second_arg","my_second_arg",0

如果您确实希望输出如Q所示,请在需要的地方有条件地加上引号("\""),并使用join(",")代替@csv

答案 1 :(得分:1)

考虑使用python及其json模块来解析json,那么您可以做几乎所有您想做的事情。这是一个几乎可以满足您需要的示例。因此,我想说的是,完全按照您想要的方式吐出它,将其更改为从文件加载json,将csv输出从StringIO更改为实际文件,就可以完成工作。

import json, csv, io

json_str = '[{"step":1,"inputs":{"first_input":{"file_id":"xxx"},"second_input":3}},{"step":2,"inputs":{"my_first_arg":{"file_id":"yyy"},"my_second_arg":0}}]'

def value(jsn):
    if not isinstance(jsn, dict):
        return jsn
    return next(iter(jsn))

jsndata = json.loads(json_str)
csvdata = io.StringIO()
csvwriter = csv.writer(csvdata)
for i in jsndata:
    step = i['step']
    for key in i['inputs']:
        val = value(i['inputs'][key])
        csvwriter.writerow([step, key, val]);

print(csvdata.getvalue())
相关问题