【问题标题】:How to use jq @CSV filter to generate a csv file with values from different json levels如何使用 jq @CSV 过滤器生成具有来自不同 json 级别的值的 csv 文件
【发布时间】:2018-02-04 18:14:36
【问题描述】:

我有一个来自 Spotify API 的 JSON 文件,其中列出了特定专辑中的所有歌曲。文件组织如下:

.
.name
.tracks.items
.tracks.items[]
.tracks.items[].artists
.tracks.items[].artists[].name
.tracks.items[].duration_ms
.tracks.items[].name

我正在使用 jq 创建一个包含以下信息的 csv:歌曲的艺术家、歌曲的标题和歌曲的持续时间。我可以使用以下语法来做到这一点:

jq -r '.tracks.items[] | [.artists[].name, .name, .duration_ms] | @csv' myfile.json

输出:

"Michael Jackson","Wanna Be Startin' Somethin'",363400
"Michael Jackson","Baby Be Mine",260666 
...

但是,我还想将.name 下的值(代表歌曲所在专辑的名称)添加到我的 csv 文件的每一行。看起来像这样的东西:

"Thriller","Michael Jackson","Wanna Be Startin' Somethin'",363400
"Thriller","Michael Jackson","Baby Be Mine",260666 
...

是否可以使用@csv 过滤器来做到这一点?我可以通过像这样硬编码专辑名称来手动完成

jq -r '.tracks.items[] | ["Thriller", .artists[].name, .name, .duration_ms] | @csv' myfile.json

但我希望有更好的方法来做到这一点。

编辑:

文件如下所示:

{
  "name": "Thriller",
  "tracks": {
    "items": [
      {
        "artists": [
          {
            "name": "Michael Jackson"
          }
        ],
        "duration_ms": 363400,
        "name": "Wanna Be Startin' Somethin'"
      },
      {
        "artists": [
          {
            "name": "Michael Jackson"
          }
        ],
        "duration_ms": 260666,
        "name": "Baby Be Mine"
      }
      ]
   }
}

【问题讨论】:

  • 顺便说一句,有一个实际的 JSON 输入样本可以帮助人们测试他们的答案。
  • @CharlesDuffy 好点。我编辑了问题。

标签: json csv hierarchical-data jq


【解决方案1】:

请参阅jq's documentation 中的“变量/符号绑定运算符”部分

jq -r '
  .name as $album_name           ### <- THIS RIGHT HERE
  | .tracks.items[]
  | [$album_name, .artists[].name, .name, .duration_ms]
  | @csv
' myfile.json

【讨论】:

  • 啊有道理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2017-01-21
相关资源
最近更新 更多