使用jq将JSON转换为CSV时表头重复的问题咨询
为什么jq生成CSV时表头会重复出现?
这事儿很好理解——你写的jq命令把表头输出和每个issue的遍历绑定在一起了!
看你原命令:
jq -r '.issues[] | ["key","component", "textRange"], [.key,.component, .textRange[]] | @csv' test.issues.json
这里的.issues[]会逐个遍历JSON里的每一个issue对象,每遍历一个对象,就会先输出一次表头数组,再输出对应的数据行数组。相当于每处理一条数据,就重复打一次表头,结果自然就是每条数据前面都带着表头了。
另外还有个小问题:你表头里写的是"textRange",但数据里是把textRange的四个子字段(startLine、endLine等)展开输出的,这会导致表头列数(3列)和数据列数(6列)不匹配,CSV结构其实是有问题的。
正确的解决办法
我们要把表头的输出和数据遍历分开,让表头只输出一次,再遍历所有数据行:
方法1:明确指定textRange的子字段
jq -r '["key","component", "startLine", "endLine", "startOffset", "endOffset"], (.issues[] | [.key, .component, .textRange.startLine, .textRange.endLine, .textRange.startOffset, .textRange.endOffset]) | @csv' test.issues.json
方法2:合并数组简化写法
如果想保留用.textRange[]展开子字段的方式,可以把数据部分的数组合并:
jq -r '["key","component", "startLine", "endLine", "startOffset", "endOffset"], (.issues[] | [.key, .component] + [.textRange[]]) | @csv' test.issues.json
这两种写法的核心都是:先单独输出一次表头数组,再遍历所有issue生成对应的数据行,这样表头只会出现一次,同时表头列数和数据列数也完全对应了。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

