使用jq将JSON文件转换为CSV文件



我有一个JSON文件叫myresponse.json。

"status":"CONTENT",
"valid":true,
"success":true,
"failure":false,
"content":{
"id":0,"resources":[{
"id":0,"value":52.51742935180664
},
{
"id":1,"value":13.392845153808594
},
{
"id":5,"value":"2021-02-09T13:15:15Z"
},
{
"id":6,"value":20.754192352294922
}]}}}

"status":"CONTENT",
"valid":true,
"success":true,
"failure":false,
"content":{
"id":0,"resources":[{

"id":0,"value":52.51742935180664
},
{
"id":1,"value":13.392845153808594
},
{
"id":5,"value":"2021-02-09T13:15:15Z"
},
{
"id":6,"value":20.754192352294922
}]}}}

用旋度得到。

如何使用jq将json转换为CSV文件,其中"0,1,5,6"必须是";0,1,5,6;"的列和值。必须分别占用CSV文件的每一行,如下所示:

0,1,5,6
52.51742935180664, 13.392845153808594, "2021-02-09T13:15:15Z", 20.754192352294922
52.51742935180664, 13.392845153808594, "2021-02-09T13:15:15Z", 20.754192352294922

谢谢你的帮助!

下面假设输入由问题中所示行的有效JSON对象流组成。

如果预先知道.id的相关值,那么生成头行是微不足道的,并且考虑到灵活性实现的解决方案如下:

def oneline:
.content.resources
| INDEX(.[]; .id) | map_values(.value);
def emit($keys):
[.[ $keys[] ]];

[0,1,5,6] as $keys
| $keys,
(inputs | oneline | emit($keys))
| join(",")

由于这依赖于inputs来读取输入,jq应该用-r和-n选项调用(例如jq -rn -f program.jq)

使用第一个对象来确定相关的。id值

如果.id的相关值是由流中的第一个JSON对象确定的,那么上面的defs可以通过以下方式重用:


(input | oneline) as $first
| ($first | keys) as $keys
| $keys,
($first | emit($keys)),
(inputs | oneline | emit($keys))
| join(",")

此解决方案将与jq的-r和-n选项一起使用。

最新更新