如何使用jq将含数组的JSON转置输出为CSV格式?
解决用jq将JSON数组转置为CSV的问题
没问题,我来帮你搞定这个转置JSON到CSV的需求!你之前的命令jq --raw-output 'keys , .[] | @csv'会把每个单独的数组输出成一行,这显然不是你要的转置后格式——我们需要的是把每个索引位置上的所有字段元素组合成一行,而且要适配任意长度的数组(最多600个元素也没问题)。
最终可用的jq命令
直接用这个命令处理你的input.json就能得到想要的结果:
jq --raw-output ' keys as $headers | .[0] | length as $rowCount | $headers, (range($rowCount) as $i | [ $headers[] | .[$i] ]) | @csv ' input.json
命令分步解释
我来拆解一下这个命令的逻辑,方便你理解:
- 获取表头:
keys as $headers把JSON对象的所有键(也就是CSV的表头字段名,比如latitude、longitude)存储到变量$headers中。 - 确定数据行数:
.[0] | length as $rowCount取第一个数组的长度作为总数据行数(你已经确认所有数组元素数量一致,所以这个操作是安全的)。 - 输出表头行:先把
$headers数组转成CSV格式,作为结果的第一行。 - 遍历生成每一行数据:用
range($rowCount) as $i遍历每个索引(从0到$rowCount-1),对于每个索引$i,遍历所有表头字段,取出该字段对应数组中第$i个元素,组成一个新数组——这个数组就是CSV的一行数据。 - 转成CSV格式:最后把表头数组和每个数据数组都通过
@csv转换成标准的CSV格式,--raw-output确保输出是纯文本而非JSON字符串。
测试你的示例输入
用你提供的input.json运行这个命令,会得到如下输出:
"latitude","longitude","drivingDifficultyIndex","iconCode","observationTimeUtcIso","precip1Hour" 39.582,26.675,0,31,"2016-06-26T00:20:00+0000",0.0 39.582,26.675,34,11,"2016-06-26T01:20:00+0000",0.1 39.582,26.675,34,11,"2016-06-26T02:20:00+0000",0.5
完全符合你期望的转置后格式,而且不管数组长度是3还是600,这个命令都能自动适配,不用手动修改行数参数~
内容的提问来源于stack exchange,提问作者WeatherBadger
相关产品推荐
相关产品推荐

