JQ的-c/--compact-output参数失效?JSON转CSV解析需求
用JQ快速将JSON转换为标准CSV格式
嘿,刚接触jq一小时就敢啃超大型数据库的活儿,够拼的!别着急,我给你几个能直接解决问题的命令,分情况给你说:
情况1:你的JSON是顶级对象数组(最常见的结构)
比如你的file2.json长这样:
[ {"id": 1, "name": "Alice", "email": "alice@example.com"}, {"id": 2, "name": "Bob", "email": "bob@example.com"} ]
直接用这条命令生成带表头的标准CSV:
jq -r '(.[0] | keys) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' file2.json > output.csv
命令解释:
-r:让jq输出原始字符串(不会给每个字段额外加冗余引号)(.[0] | keys):提取第一个对象的所有键作为CSV的表头$keys:先输出表头行map([.[ $keys[] ]]):遍历每个对象,严格按表头的顺序提取对应的值,组成数组@csv:把数组转换成符合RFC标准的CSV格式(自动处理逗号、引号等特殊字符的转义,避免格式混乱)
情况2:JSON里的数组是嵌套在某个字段下的
比如你的JSON结构是:
{ "total": 2, "records": [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"} ] }
只需要先定位到数组字段,修改命令即可:
jq -r '.records | (.[0] | keys) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' file2.json > output.csv
情况3:想要自定义分隔符的类CSV格式(比如制表符分隔)
如果不需要严格的标准CSV,只是要类似CSV的结构化文本,可以用@tsv生成制表符分隔的格式:
jq -r '(.[0] | keys) as $keys | $keys, map([.[ $keys[] ]])[] | @tsv' file2.json > output.tsv
或者自己指定分隔符(比如用分号):
jq -r '(.[0] | keys) as $keys | $keys | join(";"), (map([.[ $keys[] ]] | join(";")))[]' file2.json > output.txt
⚠️ 注意:这种自定义分隔符的方式不会自动处理特殊字符转义,如果字段里有你用的分隔符,会导致格式混乱,所以优先推荐标准CSV的命令。
另外,处理超大型JSON时,jq本身是流式处理的,只要你的内存不是特别紧张,一般都能顺利处理,不用太担心性能问题。
内容的提问来源于stack exchange,提问作者RayCrush
相关产品推荐
相关产品推荐

