如何在命令行中处理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 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

Django来敲门~第一部分【5.1.项目配置settings.py详解】

我们创建好了一个Python项目(mysite/)之后,需要在项目中添加模块应用(polls/),在模块应用中添加处理功能逻辑,如添加模块中的视图处理函数(po...

833
来自专栏三流程序员的挣扎

git rebase

rebase 这个命令正式工作中基本上没有用过,只是学习时曾经写过 Demo,但具体指令的含义不是太理解,总觉得没有 merge 来得有掌控感,而且过去使用代码...

933
来自专栏linux驱动个人学习

Android图形显示之硬件抽象层Gralloc【转】

2095
来自专栏菩提树下的杨过

Hadoop:pig 安装及入门示例

pig是hadoop的一个子项目,用于简化MapReduce的开发工作,可以用更人性化的脚本方式分析数据。 一、安装 a) 下载 从官网http://pig.a...

2109
来自专栏魂祭心

原 荐 以太坊 p2p Server 原理及

5475
来自专栏杨建荣的学习笔记

纠结的paste格式问题(未解决) (r5笔记第26天)

在使用paste命令的时候,会发现输出的结果会有一些问题,比如我们存在一个文件,内容为: ###################################...

3495
来自专栏iOS技术

YYCache 源码剖析:一览亮点

YYCache 作为当下 iOS 圈最流行的缓存框架,有着优越的性能和绝佳的设计。笔者花了些时间对其“解剖”了一番,发现了很多有意思的东西,所以写下本文分享一下...

3765
来自专栏程序猿DD

新年彩蛋:Spring Boot自定义Banner

在2016年的最后一天,借用Spring Boot的Banner向各位程序猿同仁们问候一声:Happy New Year。 ? 接下来我们就来介绍一下这个轻松愉...

2187
来自专栏Fish

利用IDEA查看和修改spark源码

经过了两天的摸索,算是初步学会了如何查看和修改spark源码。 大坑 对,这个要写在最前面,那就是注意你的scalaSDK版本!!!!不同的Spark版本支持的...

3319
来自专栏生信技能树

在R里面玩转vcf文件

其中meta存储着vcf的头文件,而fix存储在vcf的固定列,gt存储在样本基因型信息。

1233

扫码关注云+社区