如何将json的数据转化成csv的数据格式?

关注者
64
被浏览
288,297

15 个回答

推荐我写的这个 jsoncsv python 命令行工具以及相应的网站

简单易用,无须约定 JSON 为相同 schema 的,也不需要在转换时候去声明导出的 key

即支持 异构 +多层 的 JSON

原理

原理可以参考这篇回答 如何自动做json扁平化?

第一步 扁平化

将 JSON 的树状结构转换为 [(path, value), (path, value)] 的数组,

这里的 PATH 是按照一定的规律编码的

# 原始 JSON
{"user": {"name": "hello", "age": 30}, "id": 1}
{"user": {"name": "world"}, "school": ["A", "B"]}
# 扁平化
{"user.name": "hello", "user.age": 30, "id": 1}
{"user.name": "world", "school.0": "A", "school.1": "B"}

这两个数据按照一定规则,就可以互相转换。

第二步 扁平化的 JSON 转为 CSV

将扁平化的 JSON 按照 key 去重,就能得到 csv 的 header,这里是

[ "use.name", "user.age", "id", "school.0", "school.1" ]

然后用零值补齐每一行缺失的数据即可,就可以得到如下图所示的 csv

命令行使用方法

网站 [1] 和 Github 都有示例,可以去看,这里讲下命令行的用法。

安装

pip install jsoncsv

命令行使用如下

cat raw.json | jsoncsv | mkexcel > output.csv
cat raw.json | jsoncsv | mkexcel -t xls > output.xls

其中 jsoncsv 是做扁平化的,mkexcel 是转换为 csv 的 (一个工具只完成一件事)


终端下的一个例子 raw.json 是一个 多行 的 JSON 文件,执行之后可以得到 csv 文件

$ cat raw.json
{"id":1,"name":"hello","money":-100}
{"id":2,"name":"world","age":999, "address":{"city":"beijing","country":"china"}}
{"id":3,"name":"中文","age":2019, "children":["A", "B"]}
$ cat raw.json | jsoncsv | mkexcel > output.csv
$ cat output.csv
id,name,money,age,address.city,address.country,children.0,children.1
1,hello,-100,,,,,
2,world,,999,beijing,china,,
3,中文,,2019,,,A,B

转换后的 csv 文件是是这样的

会自动把缺失路径上的的 key 补齐,如第2、3行的 "money" , 第 1 行的 "age"。

多层的 JSON 会把全路径 key 作为 csv 的 field name, 如 ”adress.city“,"adress.country" 以及 “children.0”,“children.1”

"address.city" 即表示 {"address": {"city": "beijing"}} 这种结构

"children.0" 即表示 {"children": ["A", "B"]} 这种结构


配合其他工具的效果

配合 jq 或者其他命令行工具可以做很方便的事情,如一行命令生成这个回答下面评论列表的 excel 文件。(需要安装 jq 参考 stedolan.github.io/jq/d

可以试试

curl https://www.zhihu.com/api/v4/answers/134211388/comments \
|jq -r -c '.data[]'|jsoncsv|mkexcel -t xls > comments.xls

注意

如果如果是一行 array JSON 命令行可以使用 -A 参数指明

$ cat raw.json