如何将 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"
我知道这可以通过 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"