使用jq
我尝试将JSON转换为CSV。我的输入 JSON 如下所示:
{
"rows": [
{
"a": ["x","y"],
"b": "some",
"c": "string"
},
{
"a": ["u","v"],
"b": "another",
"c": "string"
}
]
}
所需的输出如下:
a | b | c
x y | some | string
u v | another | string
编辑: 对于那些提示这不是有效 CSV 的人,请使用符合 RFC 4180 的语法:
a,b,c
x y,some,string
u v,another,string
使用.rows
,我成功获取了数组:
[{"a":["x","y"],"b":"some","c":"string"},{"a":["u","v"],"b":"another","c":"string"}]
但是.rows | @csv
说:object ({"a":["x","...) 在 csv 行中无效
。所以,我必须以某种方式加入数组键“a”。
使用.rows[] | .a |加入(“”)
我得到:
"x y"
"u v"
但是我如何将其返回到我的 JSON 中然后使用 ... | @csv
获取我想要的 CSV 数据?
最佳答案
根据您的输入,以下 jq程序:
.rows[]
| map_values(if type == "array" then join(" ") else . end)
| [.[]]
| @csv
产生逗号分隔值输出:
"x y","some","string"
"u v","another","string"
添加标题很简单,所以我将其留给您。另外,让我指出,由于您指定了 CSV 输出,因此强烈建议使用 @csv
,但如果出于某种原因您想避免那些有时多余的引号,您可以摆弄字符串 -值以根据需要插入引号,然后使用 join(",")
而不是 @csv
。
或者,您可能希望将 @tsv
编织到您的解决方案中。
警告
上面的解决方案假设 a/b/c 键始终保持相同的顺序,并且对象没有附加键等。如果安全是一个问题,则只需修改行 [.[] ]
在程序中准确指定您想要的内容。
另请参阅:
有关处理 header 、确保一致性和通用性的一些想法,请参阅:
关于json - 使用 jq 将结构化 JSON 转为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307098/