前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在命令行中处理CSV文件

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

原创
作者头像
雷大亨
修改2017-12-20 11:53:16
3.9K0
修改2017-12-20 11:53:16
举报
文章被收录于专栏:遊俠扎彪遊俠扎彪

概述

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

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

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

csvkit 使用

sql2csv

  • 功能 在数据库上执行SQL语句,并转成CSV文件。
  • 示例
代码语言:txt
复制
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
  • 示例
代码语言:txt
复制
[root@CentOS ~]# in2csv data.xls > data.csv
  • 功能 2 将JSON转换成CSV
  • 示例
代码语言:txt
复制
[root@CentOS ~]# in2csv data.json > data.csv

csvcut

  • 功能 1 打印CSV文件列名
  • 示例
代码语言:txt
复制
[root@CentOS ~]# csvcut -n sixin_count.csv
  1: ftime
  2: count(*)
  • 功能 2 截取其中若干列
  • 示例
代码语言:txt
复制
[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 重新指定顺序
  • 示例
代码语言:txt
复制
[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 支持正则表达式
  • 示例
代码语言:txt
复制
[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 按照第一列来排序
  • 示例
代码语言:txt
复制
[root@CentOS ~]# csvsort -c 1 -r ./sixin_count.csv  | head -n 3
ftime,count(*)
20160605,53
20160604,51

csvstack

  • 功能 纵向累加拼接两个CSV文件 -g可以指定分组
  • 示例
代码语言:txt
复制
[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的列名
  • 示例
代码语言:txt
复制
[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文件
  • 示例
代码语言:txt
复制
[root@CentOS ~]# csvlook ./sixin_count.csv
|-----------+-----------|
|  ftime    | count(*)  |
|-----------+-----------|
|  20160415 | 390       |
|  20160416 | 456       |
|  20160417 | 473       |

csvstat

  • 功能 对CSV文件进行简单统计
  • 示例
代码语言:txt
复制
[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
  • 示例
代码语言:txt
复制
[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。
  • 示例
代码语言:txt
复制
[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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • csvkit 使用
    • sql2csv
      • in2csv
        • csvcut
          • csvgrep
            • csvsort
              • csvstack
                • csvjoin
                  • csvlook
                    • csvstat
                      • csvsql
                      • 总结
                      相关产品与服务
                      命令行工具
                      腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档