如何将 json 与数组转换为 csv?

How to convert json with array into csv?

我知道这可以通过 jq 实现,但会增加复杂性。 json 对象中的一个字段是一个字符串数组。我们如何用 jq 处理这个问题?

{
    "var": 1,
    "section": ["1","2","3"],
    "x": "test1"
},
{
    "var": 2,
    "section": ["2","3","4"],
    "x": "test2"
},
{
    "var": 3,
    "section": ["3","4","5"],
    "x": "test3"
},

我们如何制作这样的 CSV 输出?

var,section,x
"1","[1,2,3]","test1"
"2","[2,3,4]","test2"
"3","[3,4,5]","test3"

我正在考虑在 jq 参数中使用 JSON.stringify。

需要注意的是,您必须小心谨慎,并假设输入是一个 object 数组,如图所示:

.[]
| [.[]
   | if type == "array" then map(tonumber? // .) else . end
   | tostring]
| @csv

生成所需的输出,header 行除外。

("tonumber? // ."避免数组内容无法转换为数字时出错。)

泛化

这是一个变体,(a) 为第一个 object 中的所有键生成一行 header,无论它们是什么;并且 (b) 对于 re-ordering object 中的键是健壮的:

. as $in | ($in[0] | keys_unsorted) as $h | ($h, ( $in[] | ( [range(0; $h|length) as $i | getpath( [$h[$i]] )] | map(if type == "array" then map(tonumber? // .) else . end) | map(tostring) ) )) | @csv

有了这个 tocsv.jq 和你在 input.json 中的输入:

$ jq -r -f tocsv.jq input.json "var","section","x" "1","[""a"",2,3]","test1" "2","[2,3,4]","test2" "3","[3,4,5]","test3"