如何把json变成excel或csv


通过 jq 工具可以把 一段 json 数组 转换成 cvs , 然后就能用 excel 工具打开了。

jq 是支持一些数据格式的转换的。使用@符后面跟着一些特定的命令可以直接把输入格式化成对应的输出,其中 @csv 就是把一个数组对象转换成csv格式输出. 参考官方文档 https://jqlang.github.io/jq/manual/

Alt text

如何把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

评论