如何使用jq @CSV过滤器生成含多层级JSON值的CSV文件
用jq为Spotify专辑CSV添加专辑名
没问题!用jq的@csv过滤器完全能搞定这个需求,而且步骤很清晰,我给你拆解一下具体怎么做。
基础实现命令
假设你的Spotify专辑JSON结构大致是(.name对应专辑名,.tracks.items是歌曲列表),可以直接用这条命令:
jq -r '. as $album | .tracks.items[] | [$album.name, .artists[0].name, .name, .duration_ms] | @csv' input.json > output.csv
命令逐段解释
. as $album:把整个专辑的JSON对象存入变量$album,这样后续遍历每首歌时,能随时引用外层的专辑名.tracks.items[]:遍历专辑里的每一首歌曲条目[$album.name, .artists[0].name, .name, .duration_ms]:构造包含所需字段的数组:$album.name:从变量中取出专辑名.artists[0].name:取歌曲的第一位艺术家(Spotify歌曲可能有多个合作者,这里默认取第一个).name:歌曲标题.duration_ms:歌曲时长(单位:毫秒)
@csv:将数组转换为标准CSV格式,自动处理包含逗号、引号的特殊文本,避免格式错误-r:输出原始字符串(而非JSON格式的字符串),确保CSV内容不带多余的嵌套引号
适配多艺术家场景
如果你的歌曲有多个合作艺术家,想要把所有艺术家名字用逗号拼接展示,可以修改艺术家字段的处理逻辑:
jq -r '. as $album | .tracks.items[] | [$album.name, (.artists | map(.name) | join(", ")), .name, .duration_ms] | @csv' input.json > output.csv
这里用.artists | map(.name) | join(", ")把所有艺术家的名字提取出来,再拼接成一个字符串。
示例效果
假设你的输入JSON片段是:
{ "name": "Midnights", "tracks": { "items": [ { "name": "Lavender Haze", "artists": [{"name": "Taylor Swift"}], "duration_ms": 206866 }, { "name": "Maroon", "artists": [{"name": "Taylor Swift"}], "duration_ms": 218800 } ] } }
运行基础命令后生成的CSV内容:
"Midnights","Taylor Swift","Lavender Haze",206866 "Midnights","Taylor Swift","Maroon",218800
内容的提问来源于stack exchange,提问作者Hubert Léveillé Gauvin
相关产品推荐
相关产品推荐

