我正在下载api json数据,并将其转换成csv文件的最终结果。
样本数据如下所示:
{
"content": [{
"Title": "abc",
"brand": "xyz",
"information": {
"c1": "101",
"c2": "11111",
"c3": "a,b,c,d,e:abc."
}
},
{
"Title": "RX100",
"brand": "Yamaha",
"information": {
"c1": "102",
"c2": "22222",
"c3": "a."
}
},
{
"Title": "victor",
"brand": "TVS",
"information": {
"c1": "103",
"c2": "33333",
"c3": "a,b,c"
}
},
{
"Title": "R15",
"brand": "Yamaha",
"information": {
"c1": "104",
"c2": "44444",
"c3": "a,b"
}
}
]
}
我已经成功下载并转换成多个csv的基础上的标题。数据在多个csv文件中转换后,如下表所示。
Headers-> c1,c2,c3
csv1--> 101,11111,a,b,c,d,e:abc.
csv2--> 102,22222,a.
csv3--> 103,33333,a,b,c.
csv4--> 104,44444,a,b.
但是我想要上面的数据在下面的形式。
Headers-> c1,c2,c3,c4,c5,c6,c7
csv1--> 101,11111,a,b,c,d,e:abc.
csv2--> 102,22222,a.
csv3--> 103,33333,a,b,c.
csv4--> 104,44444,a,b.
是否可以使用json在我的json文件中根据",“将c3划分为不同的列数。列c3将根据存在的元素数进行划分,并将是c3数据的最大值。
发布于 2019-03-21 05:54:52
对于这些准确的数据,
jq -r '.content[].information | [.c1, .c2, .c3] | join(",")' < sample.json
只需在三列之间插入逗号就可以复制已连接的upCSV文件的效果。对于更复杂的真实数据,尤其是数字数据,这将更好地发挥作用:
jq -r '.content[].information | [.c1, .c2, (.c3|split(",")|.[])] | @csv' < sample.json
这一次都是相当标准的,达到了.c3|split(",")|.[]
,
然后,@csv
将数组转换为CSV格式。这将为示例文件产生以下输出:
"101","11111","a","b","c","d","e:abc."
"102","22222","a."
"103","33333","a","b","c"
"104","44444","a","b"
如果您不需要引号,最可靠的方法是使用@tsv
,只需替换选项卡:
jq -r '.content[].information|[.c1, .c2, .c3|split(",")|.[]] | @tsv|gsub("\t"; ",")' < sample.json
如果您的所有值都是字符串,也可以再次使用join(",")
。
如果您也希望创建文字标题行c1,...c7
,这将完成以下操作:
jq -r '[.content[].information|[.c1, .c2, (.c3|split(",")|.[])]] | (([range([.[] | length] | max)|"c" + (.+1|tostring)]|join(",")), (.[] | join(",")))' < sample.json
有三个部分:第一部分像前面一样创建列数组,然后其他两个部分使用它作为输入:
([range([.[] | length] | max)|"c" + (.+1|tostring)]|join(","))
生成标题行:它通过生成一个行长度数组来找到任何行的最大长度,创建一个范围0..maximum并在其上映射以创建一个“c1”.“c7”数组,然后将它们与逗号连接在一起。(.[] | join(","))
类似于我们之前的下半部分,同样适用于@csv
。https://unix.stackexchange.com/questions/507615
复制相似问题