使用JQ按索引重组数组 将列结构JSON转换为可输出CSV的格式
列存储JSON转CSV的jq实现方案
核心思路
输入为列优先存储的JSON结构,所有列数组长度一致,我们只需要按索引对齐各列元素生成行优先的数据集,再通过jq内置的@csv指令输出标准CSV即可,无需生成你提到的非法中间JSON结构。
可用jq表达式
1. 带表头输出(推荐)
jq -r 'keys_unsorted as $headers | $headers, (.[$headers[0]] | keys | map(. as $i | $headers | map(.[$i])))[] | @csv'
逻辑说明:
keys_unsorted as $headers:提取输入JSON的所有列名作为表头数组,keys_unsorted保证保留原始输入的列顺序,如果你需要按字母排序表头可替换为keys$headers:输出表头行(.[$headers[0]] | keys | map(. as $i | $headers | map(.[$i]))):遍历第一列的所有索引,按索引提取每一列对应位置的元素,拼接为数据行[] | @csv:将所有行(表头+数据)转换为标准CSV格式,-r参数保证输出无多余转义的原始CSV字符串
2. 不带表头输出
去掉表达式中输出表头的部分即可:
jq -r 'keys_unsorted as $headers | (.[$headers[0]] | keys | map(. as $i | $headers | map(.[$i])))[] | @csv'
输出效果
使用你提供的输入示例(修复非法数值后)执行上述命令,即可直接得到你期望的CSV结果:
AAA,BBB,CCC,DDD,EEE 111.1,222.1,333.1,444.1,555.1 111.2,222.2,333.2,444.2,555.2 111.3,222.3,333.3,444.3,555.3 111.4,222.4,333.4,444.4,555.4 111.5,222.5,333.5,444.5,555.5
内容的提问来源于stack exchange,提问作者TKF
相关产品推荐
相关产品推荐

