如何在命令行中处理CSV文件

概述

CSV,全称Comma-Separated Values。CSV文件是每一行都是以逗号分隔的纯文本文件。

既然是纯文本,那么Linux下所有文本处理工具都可以大展拳脚,比如sed、grep等,但其实还有一些更为傻瓜、更为高效的工具,比如csvkit工具包。

csvkit是用Python写成的一个专门的CSV处理程序,既提供了命令行工具集,也能当做Python Library使用。安装方式很简单,直接pip install csvkit就可以了。

csvkit 使用

sql2csv

  • 功能 在数据库上执行SQL语句,并转成CSV文件。
  • 示例
usage: sql2csv [-h] [-v] [-l] [--db CONNECTION_STRING] [-q QUERY] [-H] [FILE]

[root@CentOS ~]# sql2csv --db "mysql://root:ligewei@127.0.0.1:3306/hlw" --query "select ftime, count(*) from z_reg_tmp group by ftime" > sixin_count.csv

in2csv

  • 功能 1 将Excel转换成CSV
  • 示例
[root@CentOS ~]# in2csv data.xls > data.csv
  • 功能 2 将JSON转换成CSV
  • 示例
[root@CentOS ~]# in2csv data.json > data.csv

csvcut

  • 功能 1 打印CSV文件列名
  • 示例
[root@CentOS ~]# csvcut -n sixin_count.csv
  1: ftime
  2: count(*)
  • 功能 2 截取其中若干列
  • 示例
[root@CentOS ~]# head -n 3 sixin_count.csv
ftime,count(*)
20160415,390
20160416,456
[root@CentOS ~]# csvcut -c ftime ./sixin_count.csv > ftime.csv
[root@CentOS ~]# head -n 3 ftime.csv
ftime
20160415
20160416
  • 功能 3 重新指定顺序
  • 示例
[root@CentOS ~]# head -n 3 sixin_count.csv
ftime,count(*)
20160415,390
20160416,456
[root@CentOS ~]# csvcut -c "count(*),ftime" ./sixin_count.csv | head -n 3
count(*),ftime
390,20160415
456,20160416

csvgrep

  • 功能 类似grep,搜索过滤CSV中的某些列 -c 指定列,如 -c 1 指定第一列 -r 支持正则表达式
  • 示例
[root@CentOS ~]# csvgrep -c 1 -r "2016060*" ./sixin_count.csv
ftime,count(*)
20160601,336
20160602,305
20160603,69
20160604,51
20160605,53

csvsort

  • 功能 类似sort,对CSV文件中的行进行排序 -c 指定列,如 -c 1 按照第一列来排序
  • 示例
[root@CentOS ~]# csvsort -c 1 -r ./sixin_count.csv  | head -n 3
ftime,count(*)
20160605,53
20160604,51

csvstack

  • 功能 纵向累加拼接两个CSV文件 -g可以指定分组
  • 示例
[root@CentOS ~]# cat 1.csv
ftime,count(*)
20160415,390
20160416,456
[root@CentOS ~]# cat 2.csv
ftime,count(*)
20160603,69
20160604,51
[root@CentOS ~]# csvstack -g head,tail 1.csv 2.csv
group,ftime,count(*)
head,20160415,390
head,20160416,456
tail,20160603,69
tail,20160604,51

csvjoin

  • 功能 横向join CSV文件 -c 指定join on的列名
  • 示例
[root@CentOS ~]# cat 1.csv
ftime,count
20160415,390
20160416,456
[root@CentOS ~]# cat 2.csv
ftime,sum
20160415,1000
20160416,2000
20160417,3000
20160418,4000
[root@CentOS ~]# csvjoin -c "ftime"  1.csv 2.csv
ftime,count,ftime,sum
20160415,390,20160415,1000
20160416,456,20160416,2000

csvlook

  • 功能 更漂亮地地打印CSV文件
  • 示例
[root@CentOS ~]# csvlook ./sixin_count.csv
|-----------+-----------|
|  ftime    | count(*)  |
|-----------+-----------|
|  20160415 | 390       |
|  20160416 | 456       |
|  20160417 | 473       |

csvstat

  • 功能 对CSV文件进行简单统计
  • 示例
[root@CentOS ~]# csvstat ./sixin_count.csv
  1. ftime
        <type 'int'>
        Nulls: False
        Min: 20160415
        Max: 20160605
        Sum: 1048345771
        Mean: 20160495.5962
        Median: 20160510.5
        Standard Deviation: 55.2794507707
        Unique values: 52
  2. count(*)
        <type 'int'>
        Nulls: False
        Min: 51
        Max: 1260
        Sum: 29206
        Mean: 561.653846154
        Median: 517.0
        Standard Deviation: 236.189044608
        Unique values: 50
        5 most frequent values:
                454:    2
                509:    2
                450:    1
                451:    1
                665:    1

Row count: 52

csvsql

  • 功能 1 从CSV导入到数据库,支持创建表table并导入数据 如果没有--insert,只创建table
  • 示例
[root@CentOS ~]# mysqlshow -h 127.0.0.1 -P 3306  hlw -p
Enter password:
Database: hlw
+--------------+
|    Tables    |
+--------------+
| t_dw_dc00294 |
| uid_mobile   |
| z_reg_tmp    |
+--------------+
[root@CentOS ~]# csvsql --db "mysql://root:ligewei@127.0.0.1:3306/hlw" --insert ./sixin_count.csv
[root@CentOS ~]# mysqlshow -h 127.0.0.1 -P 3306  hlw -p
Enter password:
Database: hlw
+--------------+
|    Tables    |
+--------------+
| sixin_count  |
| t_dw_dc00294 |
| uid_mobile   |
| z_reg_tmp    |
+--------------+
  • 功能 2 不用真正操作数据库,直接支持SQL查询操作,这个是大招! 再也不用Excel公式发愁了,直接上SQL。
  • 示例
[root@CentOS ~]# csvsql --query "select * from sixin_count where ftime > 20160600;" sixin_count.csv | csvlook
|-----------+-----------|
|  ftime    | count(*)  |
|-----------+-----------|
|  20160601 | 336       |
|  20160602 | 305       |
|  20160603 | 69        |
|  20160604 | 51        |
|  20160605 | 53        |
|-----------+-----------|

总结

csvkit提供了一整套成熟的处理CSV工具集,包括格式转换、搜索、合并等,而且使用起来简单方便,是一套很精致的工具。

参考资料:

  1. https://csvkit.readthedocs.io/en/0.9.1/index.html
  2. http://docs.sqlalchemy.org/en/latest/faq/connections.html
  3. https://github.com/wireservice/csvkit

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

CDH5.14和CM5.14的新功能

Fayson在2017年的10月12日介绍了《CDH5.13和CM5.13的新功能》,今天1月26日,Cloudera正式发布了CDH5.14。三个月零几天,2...

1K6
来自专栏运维小白

Linux基础(day1)

1.2 约定 使用的系统软件 系统centos7.3系统 虚拟软件VMware workstation 10 终端puTTY+Xshell puTTY下载地址...

17810
来自专栏云知识学习

kubernetes 1.8+集群使用metrivcs-server 监控集群基础信息

大体意思是基础指标由metrics-serve收集,通过 kubectl top展示,并通过metrics.k8s.ioAPI 公开。metrics-serv...

2118
来自专栏SDNLAB

利用pipework与OVS构建跨主机容器网络

一、前言 本文提供了一种可行的、灵活的方案用于构建跨主机的Docker容器网络。鉴于目前的各类网络方案均依赖其他大型项目(比如CoreOS,Kubernetes...

4279
来自专栏杂烩

SSM项目搭建之redis 原

        Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从20...

786
来自专栏腾讯技术工程官方号的专栏

腾讯技术课|基于Elastic Stack 搭建日志分析平台

? 为了让读者们可以更好的理解「如何基于Elastic Stack 搭建日志分析平台」,腾讯技术工程公众号特别邀请腾讯基础架构部的陈曦工程师通过语音录播分享的...

1802
来自专栏Hadoop实操

CDH5弃用的项目

1112
来自专栏吴伟祥

Nginx负载均衡5种配置方式 原

1、轮询(默认)    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。   2、weight  指定轮询几率...

563
来自专栏乐沙弥的世界

Linux 主机网络接入配置

网络配置是我们在安装好操作系统之后,需要解决的第一步。现时代没有接入网络的主机已然等同于一堆废铁。在网络配置的过程中,通常我们需要配置本机IP地址,缺省网关,D...

900
来自专栏北京马哥教育

Mycat读写分离与主从切换

环境说明 本文的环境信息: 192.168.1.248: slave节点 192.168.1.250: master节点 数据库服务准备工作 主从配置完成后,S...

3867

扫码关注云+社区