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

相关文章

来自专栏社区的朋友们

MySQL 入门常用命令大全(上)

作为一个 MySQL 的初学者,在短短的几个月中接触了一下,记录了一下工作中用到的 SQL 语句以及未来可能会用到的 MySQL 知识点,作为日后的参考手册。因...

7611
来自专栏Flutter入门到实战

Android适配全面总结(二)----版本适配

版权声明:本文为博主原创文章(部分引用他人博文,已加上引用说明),未经博主允许不得转载。https://www.jianshu.com/p/49fa8ebc01...

1781
来自专栏mySoul

Node 连接mysql数据库

github地址 https://github.com/jxcore/jxcore

1284
来自专栏乐沙弥的世界

Possible MySQL server UUID duplication for server

    在mysql enterprise monitor监控过程中出现这样的event事件,Topic: Possible MySQL server UUID...

542
来自专栏沃趣科技

配置详解 | performance_schema全方位介绍

在上一篇 《初相识 | performance_schema全方位介绍》 中粗略介绍了如何配置与使用performance_schema,相信大家对perfor...

7517
来自专栏安恒网络空间安全讲武堂

WriteUp分享 | LCTF的一道preg_match绕过+出题人的锅

0x00题目 http://123.206.120.239/ idea/workspace.xml 泄露文件信息,常见于用phpstorm写项目然后同步到git...

9716
来自专栏PPV课数据科学社区

SQL Server优化50法

查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效...

3207
来自专栏晨星先生的自留地

面试中遇到的坑之mysql注入入门

1904
来自专栏MySQL实战分享

MySQL 经典案例分析:Specified key was too long

BG 内部要进行数据库的容灾演习,需要模拟线上实际的环境进行测试,这就需要 copy 一份线上的数据库到测试库中,其实也就是重建一个线上数据库。要完成这个任务其...

3.7K6
来自专栏Vamei实验室

被解放的姜戈02 庄园疑云

上一回说到,姜戈的江湖初体验:如何架设服务器,如何回复http请求,如何创建App。这一回,我们要走入糖果庄园。 数据库是一所大庄园,藏着各种宝贝。一个没有数据...

1985

扫码关注云+社区