【问题标题】:How to combine values from different JSON objects to one line of CSV using jq如何使用 jq 将来自不同 JSON 对象的值组合到一行 CSV
【发布时间】:2019-06-25 13:35:20
【问题描述】:

我想从 JSON 文件中提取数据并使用 将其写入 CSV 文件。

这是我的数据样本:

[
  {
    "media": {
      "track": [
        {
          "attype": "General",
          "FileExtension": "MP4",
          "Format": "MPEG-4"
        },
        {
          "attype": "Video",
          "Format": "MPEG Video"
        }
      ]
    }
  },
  {
    "media": {
      "track": [
        {
          "attype": "General",
          "FileExtension": "ts",
          "Format": "MPEG-TS"
        },
        {
          "attype": "Video",
          "Format": "MPEG Video"
        }
      ]
    }
  }
]

这是所需的输出:

"MP4","MPEG-4","MPEG Video"
"ts","MPEG-TS","MPEG Video"

这是我的 代码:

.[].media.track[] |
  [
    (select(.attype =="General") | .FileExtension, .Format),
    (select(.attype =="Video") | .Format)
  ] | @csv

这是实际输出:

"MP4","MPEG-4"
"MPEG Video"
"ts","MPEG-TS"
"MPEG Video"

我已经尝试过flatten 过滤器和方括号[] 的不同用法来构建数组,但无济于事。如何使用 达到所需的输出?

【问题讨论】:

    标签: jq jq jq json csv jq


    【解决方案1】:

    你在正确的轨道上(双关语)——你只需要扩展 .track 如下:

    .[].media.track
    | [.[]
       | (select(.attype =="General") | .FileExtension, .Format),
         (select(.attype =="Video") | .Format) ]
    | @csv
    

    或者...

    如果你觉得所有这些括号和括号太分散注意力,你可以选择:

    .[].media.track
    | map( if .attype =="General" then .FileExtension, .Format
           elif .attype =="Video" then .Format
           else empty
           end )
    | @csv
    

    【讨论】:

    • 为什么... track | [ .[] ... ] 提供与... track[] | [ ... ] 不同的输出?
    • 理解差异的一种方法是插入debug 语句。
    • @vintnes 两个右手过滤器创建一个数组。在第一种情况下,过滤器被调用一次,并将整个轨道数组作为输入。在第二种情况下,每个轨道数组的元素都会调用一次过滤器,并且只有这个元素作为输入
    【解决方案2】:

    一种解决方案是为每个媒体而不是每个轨道创建一个单元格数组:

    .[].media | 
      [ 
        .track[] |
           (select(.attype =="General") | .FileExtension, .Format),
           (select(.attype =="Video") | .Format)
      ] | @csv
    

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多