通过 jq 工具可以把 一段 json 数组 转换成 cvs , 然后就能用 excel 工具打开了。
jq 是支持一些数据格式的转换的。使用@
符后面跟着一些特定的命令可以直接把输入格式化成对应的输出,其中 @csv
就是把一个数组对象转换成csv格式输出. 参考官方文档 https://jqlang.github.io/jq/manual/
如何把json转换成csv
[
{
"name": "Alice",
"age": 25,
"location": "City A"
},
{
"name": "Bob",
"age": 30,
"location": "City B"
}
]
如果只想取部分字段组成数据
例如只把 name 和 age 取出来的话
json='[{"name":"Alice","age":25,"location":"City A"},{"name":"Bob","age":30,"location":"City B"}]'
echo "${json}"| jq -r '.[] | [.name, .age] | @csv'
上面的就会输出
"Alice",25
"Bob",30
如果想把全部的字段都取出来
我们可以把所有的字段都写出来
json='[{"name":"Alice","age":25,"location":"City A"},{"name":"Bob","age":30,"location":"City B"}]'
echo "${json}"| jq -r '.[] | [.name, .age,.location] | @csv'
上面的就会输出
也可以使用jq的一些高级方法
json='[{"name":"Alice","age":25,"location":"City A"},{"name":"Bob","age":30,"location":"City B"}]'
echo "${json}" | jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv'
这个命令中,首先使用 (.[0] | keys_unsorted) 获取JSON数组中第一个对象的键作为CSV的列名。然后使用 $keys 变量存储列名。接下来,使用 map([.[ $keys[] ]])[] 将每个对象的值组成一个数组。最后,使用 @csv 将数组转换为CSV格式。
上面的就会输出
"name","age","location"
"Alice",25,"City A"
"Bob",30,"City B"
这种写法会连同表头一起输出,不过表头是字段的名字
如何去掉输出结果中的引号
注意到上面输出的结果中所有的都挂着一个引号,虽然csv展示没有问题,但在处理数据的时候就得时刻注意着这些引号。
我们可以在 转换成 csv 之后在用 sef
工具把 "
去掉 sed 's/"//g'
json='[{"name":"Alice","age":25,"location":"City A"},{"name":"Bob","age":30,"location":"City B"}]'
echo "${json}" | jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' | sed 's/"//g'
这样输出就变成了
name,age,location
Alice,25,City A
Bob,30,City B