繁体   English   中英

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

[英]Convert JSON file to CSV file using jq

我有名为 myresponse.json 的 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
      }]}}}

使用 curl 获得。

我如何使用 jq 将 json 转换为 csv 文件,其中“0,1,5,6”必须是列,“0,1,5,6”的值必须分别占据 Z628CB5675FF524F3E719B7AAFE 文件的每一行,例如 this :

  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 对象的 stream 组成,沿问题中显示的行。

如果事先知道 .id 的相关值,则生成 header 行是微不足道的,考虑到灵活性的解决方案如下:

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

使用第一个 object 确定相关的.id 值

如果.id的相关值由stream中的第一个JSON object决定,则上述defs可以重复使用如下:


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM