【问题标题】:Convert json to csv using jq, with array nested within array使用 jq 将 json 转换为 csv,数组嵌套在数组中
【发布时间】:2021-02-27 17:26:32
【问题描述】:

如何展平这个 json 数组并使用 jq 写入 csv 文件,以便每一行包含所有字段,即

我是 jq 的新手,但从这个开始,它不会捕获内部嵌套数组

jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[]'

[
   {
      "name":"PM2.5",
      "unit":"ug/m3",
      "values":[
         {
            "timestamp":"2020-11-16T13:10:21.135Z",
            "value":3.696
         },
         {
            "timestamp":"2020-11-16T13:10:31.649Z",
            "value":3.696
         },
         {
            "timestamp":"2020-11-16T13:10:42.35Z",
            "value":3.696
         },
         {
            "timestamp":"2020-11-16T13:10:52.953Z",
            "value":3.696
         }
      ]
   },
   {
      "name":"PM10",
      "unit":"ug/m3",
      "values":[
         {
            "timestamp":"2020-11-16T13:10:21.135Z",
            "value":7.596
         },
         {
            "timestamp":"2020-11-16T13:10:31.649Z",
            "value":7.596
         },
         {
            "timestamp":"2020-11-16T13:10:42.35Z",
            "value":7.596
         },
         {
            "timestamp":"2020-11-16T13:10:52.953Z",
            "value":7.596
         }
      ]
   }
]

到一个csv如下:

"name", "unit", "timestamp", "value"
"PM2.5", "ug/m3", "2020-11-16T13:10:21.135Z", 3.696
"PM2.5", "ug/m3", "2020-11-16T13:10:31.649Z", 3.696
"PM2.5", "ug/m3", "2020-11-16T13:10:42.35Z", 3.696
"PM2.5", "ug/m3", "2020-11-16T13:10:52.953Z", 3.696  
"PM10", "ug/m3", "2020-11-16T13:10:21.135Z", 7.596
"PM10", "ug/m3", "2020-11-16T13:10:31.649Z", 7.596
"PM10", "ug/m3", "2020-11-16T13:10:42.35Z", 7.596
"PM10", "ug/m3", "2020-11-16T13:10:52.953Z", 7.596

【问题讨论】:

  • @Shawn 是的,很抱歉试图添加,但被堆栈溢出标记为 for being mostly code,我现在添加了一个示例
  • @Shawn 是的,你是对的,这是最小的例子

标签: json nested export-to-csv jq


【解决方案1】:
$ jq -r '
  [["name","unit","timestamp","value"]], 
   [ .[] 
     | [ .name, .unit ] + 
       (.values[] | [.timestamp,.value]) ] 
  | .[] 
  | @csv' input.json 
"name","unit","timestamp","value"
"PM2.5","ug/m3","2020-11-16T13:10:21.135Z",3.696
"PM2.5","ug/m3","2020-11-16T13:10:31.649Z",3.696
"PM2.5","ug/m3","2020-11-16T13:10:42.35Z",3.696
"PM2.5","ug/m3","2020-11-16T13:10:52.953Z",3.696
"PM10","ug/m3","2020-11-16T13:10:21.135Z",7.596
"PM10","ug/m3","2020-11-16T13:10:31.649Z",7.596
"PM10","ug/m3","2020-11-16T13:10:42.35Z",7.596
"PM10","ug/m3","2020-11-16T13:10:52.953Z",7.596

构建一个数组数组,每行一个,包括标题行,然后将它们全部格式化为 CSV 记录。

【讨论】:

  • 感谢不是我所追求的输出格式,我已经改进了问题
  • 这可以通过删除最后的 .[] 来简化(并提高效率),如下所示:'["name", "unit", "timestamp", "value"] , (.[] | [.name, .unit] + (.values[] | [.timestamp, .value])) | @csv'
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2019-03-16
相关资源
最近更新 更多