You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:28:48