首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jq将来自不同JSON对象的值组合到CSV的一行中

如何使用jq将来自不同JSON对象的值组合到CSV的一行中
EN

Stack Overflow用户
提问于 2019-06-25 21:35:20
回答 2查看 203关注 0票数 1

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

这是我的数据示例:

代码语言:javascript
复制
[
  {
    "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"
        }
      ]
    }
  }
]

这是所需的输出:

代码语言:javascript
复制
"MP4","MPEG-4","MPEG Video"
"ts","MPEG-TS","MPEG Video"

这是我的jq代码:

代码语言:javascript
复制
.[].media.track[] |
  [
    (select(.attype =="General") | .FileExtension, .Format),
    (select(.attype =="Video") | .Format)
  ] | @csv

这是实际的输出:

代码语言:javascript
复制
"MP4","MPEG-4"
"MPEG Video"
"ts","MPEG-TS"
"MPEG Video"

我尝试过使用flatten过滤器和不同用法的方括号[]来构造数组,但都无济于事。如何使用jq获得所需的输出

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-25 22:07:41

您的思路是对的(双关语) --您只需按如下方式扩展.track:

代码语言:javascript
复制
.[].media.track
| [.[]
   | (select(.attype =="General") | .FileExtension, .Format),
     (select(.attype =="Video") | .Format) ]
| @csv

或者..。

如果你觉得所有这些括号和括号太让人分心,你可以这样做:

代码语言:javascript
复制
.[].media.track
| map( if .attype =="General" then .FileExtension, .Format
       elif .attype =="Video" then .Format
       else empty
       end )
| @csv
票数 4
EN

Stack Overflow用户

发布于 2019-06-25 22:05:05

一种解决方案是为每个介质而不是每个轨道创建一个单元阵列:

代码语言:javascript
复制
.[].media | 
  [ 
    .track[] |
       (select(.attype =="General") | .FileExtension, .Format),
       (select(.attype =="Video") | .Format)
  ] | @csv
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56755346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档