当前位置: 代码网 > 服务器>服务器>Linux > 使用命令行将json数据导出到csv(一行命令搞定)

使用命令行将json数据导出到csv(一行命令搞定)

2024年05月18日 Linux 我要评论
命令行导出json数据到csv临近年终,经常遇到把接口数据导出到csv,再进一步做成图表放入ppt中的诉求,毕竟ppt才是最好的语言!每次导出数据都要写一堆代码,未免太浪费时间,送你一串神奇的命令行指

命令行导出json数据到csv

临近年终,经常遇到把接口数据导出到csv,再进一步做成图表放入ppt中的诉求,毕竟ppt才是最好的语言!

每次导出数据都要写一堆代码,未免太浪费时间,送你一串神奇的命令行指令,让你快速导出json到csv中,事半功倍!

处理json,肯定绕不过jq这个命令。之前的文章:《教你在命令行操作json》介绍了jq基础的用法。本篇文章就借着导出数据这个实际的需求,再介绍下jq的高级用法

简单

先来个简单版本的,接口响应内容如下,我们只想导出其中的codename字段到scv

[
    {"code": "nsw", "name": "new south wales", "level":"state", "country": "au"},
    {"code": "ab", "name": "alberta", "level":"province", "country": "ca"},
    {"code": "abd", "name": "aberdeenshire", "level":"council area", "country": "gb"},
    {"code": "ak", "name": "alaska", "level":"state", "country": "us"}
]
$ cat j.json | jq -r '. | ["name", "code"], map([.name, .code])[] | @csv'
"name","code"
"new south wales","nsw"
"alberta","ab"
"aberdeenshire","abd"
"alaska","ak"

可以先尝试自行理解上面jq的使用,下面我们加大难度,自动提取数据的全部字段,并添加表头

进阶

先看下进阶版本的全貌,为了换行更加清晰的展示,这里把jqfilter单独放入了一个文件,在执行jq的时候只需要指定-f file即可。效果和在命令行中一样。

# filters 文件内容
(map(keys) | add | unique) as $header
    | map(. as $row | $header | map($row[.])) as $rows
    | $header, $rows[]
    | @csv
# j.json文件内容
# [
#     {"code": "nsw", "name": "new south wales", "level":"state", "country": "au"},
#     {"code": "ab", "name": "alberta", "level":"province", "country": "ca"},
#     {"code": "abd", "name": "aberdeenshire", "level":"council area", "country": "gb"},
#     {"code": "ak", "name": "alaska", "level":"state", "country": "us"}
# ]
$ cat j.json | jq -r -f filters | tee j.csv
"code","country","level","name"
"nsw","au","state","new south wales"
"ab","ca","province","alberta"
"abd","gb","council area","aberdeenshire"
"ak","us","state","alaska"

提取csv的表头

(map(keys) | add | unique) as $header 用来提取csv第一行需要的表头。逐个命令看下

✨ keys   对象所有key组成的数组

$ echo '{"code": "nsw", "name": "new south wales", "level":"state", "country": "au"}' | jq 'keys'
[
  "code",
  "country",
  "level",
  "name"
]

✨ map(f) 可以对数组的每一项进行f操作,然后合并结果

$ echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' | jq 'map(.name)'
[
  "foo",
  "bar",
  "foobar"
]

f可以是更复杂的函数,例如length可以获取字符串或数组的长度,把length放到map中,得到数组每一个元素的长度

$ echo '["foo", "bar", "foobar"]' | jq 'map(length)'
[
  3,
  3,
  6
]

所以map(keys)对于下面这段json来说。对数组中每一个元素执行keys,即对象所有key组成的数组

# j.json
[
    {"code": "nsw", "name": "new south wales", "level":"state", "country": "au"},
    {"code": "ab", "name": "alberta", "level":"province", "country": "ca"},
    {"code": "abd", "name": "aberdeenshire", "level":"council area", "country": "gb"},
    {"code": "ak", "name": "alaska", "level":"state", "country": "us"}
]
$ cat j.json | jq 'map(keys)'
[
  [
    "code",
    "country",
    "level",
    "name"
  ],
  [
    "code",
    "country",
    "level",
    "name"
  ],
  [
    "code",
    "country",
    "level",
    "name"
  ],
  [
    "code",
    "country",
    "level",
    "name"
  ]
]

✨ add | unique 顾名思义,首先将数组合并,然后再去重

$ cat j.json | jq 'map(keys) | add | unique'
[
  "code",
  "country",
  "level",
  "name"
]

(map(keys) | add | unique) as $header 总结就是遍历要转换成csv的每一条数据,取每一条数据的所有key,合并去重。相比于取数据的第一条作为表头,这种方式获取了所有数据的字段,避免第一条后面数据的字段多于第一条的情况

生成表格数据

map(. as $row | $header | map($row[.])) as $row就是生成表格内容的主要命令

最外层的map遍历处理每一行数据,我们看看如何对每一行进行处理

🌲 . as $row相当于给当前行命名成$row

🌲$header | map($row[.]) 此时上下文已经变成了$header

🌲🌲 ``map(遍历表头的每一个字段,从row中获取对应的值。类似、row["country"]$row["level"]`这样

对每一行处理完后,就得到了多行的表格的内容区域

$ cat j.json | jq -r '(map(keys) | add | unique) as $header | map(. as $row | $header | map($row[.])) as $rows | $header, $rows[] '
[
  "code",
  "country",
  "level",
  "name"
]
[
  "nsw",
  "au",
  "state",
  "new south wales"
]
[
  "ab",
  "ca",
  "province",
  "alberta"
]
[
  "abd",
  "gb",
  "council area",
  "aberdeenshire"
]
[
  "ak",
  "us",
  "state",
  "alaska"
]

输出成csv

@csv指令能很好的完成把数组转换成csv的工作。

最终完成的效果如下,说简单也简单,说复杂也复杂。命令有点长,往后滑👉

$ cat j.json | jq -r '(map(keys) | add | unique) as $header | map(. as $row | $header | map($row[.])) as $rows | $header, $rows[] | @csv'
"code","country","level","name"
"nsw","au","state","new south wales"
"ab","ca","province","alberta"
"abd","gb","council area","aberdeenshire"
"ak","us","state","alaska"

课后题

有时候接口返回的数据可能会是如下结构,思考下如何利用jq完成csv的转换吧

{
    "headers": [
        "code",
        "name",
        "level",
        "country"
    ],
    "data": [
        ["nsw", "new south wales", "state", "au"],
        ["ab", "alberta", "province", "ca"],
        ["abd", "aberdeenshire", "council area", "gb"],
        ["ak", "alaska", "state", "us"]
    ]

以上就是使用命令行将json数据导出到csv(一行命令搞定)的详细内容,更多关于json数据导出到csv的资料请关注代码网其它相关文章!

(0)

相关文章:

  • Linux下查看内存使用情况的方法总结

    前言在做linux系统优化的时候,物理内存是其中最重要的一方面。自然的,linux也提供了非常多的方法来监控宝贵的内存资源的使用情况。下面的清单详细的列出了linux系统下通过视图…

    2024年05月18日 服务器
  • 在Linux中重命名文件和目录的几种方法

    前言在这篇基本命令行教程中,你将学习在 linux 终端重命名文件和目录的各种方法。如何在 linux 终端中重命名文件和目录?你可以使用mv命令。是的,与用于将文件和文件夹从一个…

    2024年05月18日 服务器
  • 将shell脚本正确的放在后台运行方式

    1.1 将shell脚本放在后台运行的方式这个有很多种方式哈,可以百度。我常用以下两种####### 我常用的两种& # 放在后台运行,但要注意了,不能是中…

    2024年05月18日 服务器
  • linux踢出远程登录用户命令(总结篇)

    linux踢出远程登录用户命令:查看当前自己的终端:[root@hadoop3 ~]# who am iroot pts/1 2013-01-22 10:45…

    2024年05月18日 服务器
  • Linux修改主机名的命令详解

    Linux修改主机名的命令详解

    引言通常在购买的服务器或者一些新安装的linux系统主机名是一个随机的字符串,但是如果说我们想标识一下每台主机的名称,或者是单纯有强迫症,我们就可以修改一下主机... [阅读全文]
  • Linux Shell任务控制的实现示例

    Linux Shell任务控制的实现示例

    通常情况下运行脚本的方式就是以实时模式在命令行界面上直接运行,除此之外还有很多其他的运行脚本的方式,如后台运行,定时运行等等。除运行方式外,还可以对脚本程序的运... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com