如何将JSON数组转换为CSV行?

时间:2019-06-19 15:33:06

标签: json bash csv export-to-csv jq

我正在尝试将大型JSON文件转换为CSV格式。 (我刚刚学习了jq的使用方法,所以我还是一个初学者。)

我已经成功地转换了大多数数据,但是,我被困在一个数组上。该文件中的每个JSON对象都应该转换为单个CSV行,而我无法使其正常工作。

我一直在尝试通过现有答案来帮助自己: Convert/Export JSON to CSV

但是问题是该方法为数组中的每个项目写一行,不必要地重复信息。

我使用的命令类型与上述答案相同,唯一的区别是列的名称,但数组块...

例如,我可能有一个类似于JSON的文件:

{resources:[
    {"id":"001","name"="Robert","items":[
        {"label":"00A","name":"Pen"},
        {"label":"00B","name":"Paper"}],
    {"id":"002","name"="Bruce","items":[
        {"label":"00A","name":"Pen"},
        {"label":"00B","name":"Computer"},
        {"label":"00C","name":"Headphones"}]
]
}

我想成为:

001,Robert,Pen,Paper,
002,Bruce,Pen,Computer,Headphones

我只需要数组的name

目前,结果是:

001,Robert,Pen
001,Robert,Paper
002,Bruce,Pen,
002,Bruce,Computer
002,Bruce,Headphones

问题是每个JSON对象的实际数组长约30个项目,无法使用这种方式。

2 个答案:

答案 0 :(得分:4)

$ jq -r '.resources[] | [.id,.name,.items[].name] | @csv' < /tmp/b.json
"001","Robert","Pen","Paper"
"002","Bruce","Pen","Computer","Headphones"

答案 1 :(得分:-1)

您可以使用awk修复当前的输出文件。

awk -F, '{a[$1","$2]=a[$1","$2]","$3}; END{for (v in a) print v a[v]}' in.txt | sort >out.txt

输入:

001,Robert,Pen
001,Robert,Paper
002,Bruce,Pen,
002,Bruce,Computer
002,Bruce,Headphones

输出:

001,Robert,Pen,Paper
002,Bruce,Pen,Computer,Headphones