如何使用jq将嵌套JSON转换为按记录分行的扁平化CSV
如何用jq将嵌套JSON转换为按记录分行的扁平化CSV
我来帮你解决这个jq转CSV的问题——你之前的写法核心问题是没有正确遍历每条Data记录并单独处理成CSV行,下面是具体的解决方案:
核心思路
要实现每条产品记录对应一行CSV,关键是遍历.Data数组的每一个元素,对单个记录提取需要的字段组成数组,再将这个数组转换为CSV行,而不是把所有字段值合并成一个大数组。
正确的jq命令
基础版本(自动处理类型)
.Data[] | [.ID, .Marchio.ID, .Marchio.Codice, .Marchio.Descrizione, .Codifica.CodEan] | @csv
逐部分解释:
.Data[]:遍历Data数组中的每一条产品记录,每次只处理一个单独的产品对象[.ID, .Marchio.ID, ...]:从当前处理的产品对象中,提取你需要的嵌套字段,组成一个仅对应当前记录的数组| @csv:将这个单记录数组转换为符合CSV规范的一行文本,自动处理字符串引号和数字格式
强制转字符串版本(匹配你示例的带引号数字)
如果需要确保所有字段(包括数字类型的ID)都被包裹在引号中,可以给每个字段加上tostring转换:
.Data[] | [ (.ID|tostring), (.Marchio.ID|tostring), (.Marchio.Codice|tostring), (.Marchio.Descrizione|tostring), (.Codifica.CodEan|tostring) ] | @csv
你之前写法的问题分析
- 第一个写法
[.Data[].ID, .Data[].Marchio.ID...] | @csv:是把所有产品的ID、所有产品的Marchio.ID等分别提取出来,拼成一个超大数组,自然所有值会挤在一行 - 第二、三个写法用了
map:map是对整个Data数组的每个元素执行提取操作,返回的是一个包含所有记录字段数组的大数组,之后的[]是展开这个大数组,最终还是把所有字段值合并成一个数组转成一行,没有实现单记录单行的效果
示例验证
假设你的输入JSON是:
{ "Pagination": { "Total": 3 }, "Data": [ { "ID": 35058, "Marchio": { "ID": 1, "Codice": "APP", "Descrizione": "Apple" }, "Codifica": { "CodEan": "0190199077621" } }, { "ID": 35078, "Marchio": { "ID": 1, "Codice": "APP", "Descrizione": "Apple" }, "Codifica": { "CodEan": "0190199062627" } }, { "ID": 28129, "Marchio": { "ID": 1, "Codice": "APP", "Descrizione": "Apple" }, "Codifica": { "CodEan": "0190198496492" } } ] }
运行上述jq命令后,输出完全符合你的期望:
"35058","1","APP","Apple","0190199077621" "35078","1","APP","Apple","0190199062627" "28129","1","APP","Apple","0190198496492"
内容的提问来源于stack exchange,提问作者Danilo
相关产品推荐
相关产品推荐

