CSVKIT——处理csv文件的瑞士军刀

统计和数据处理都离不开csv文件,一般来说,操作csv都是依赖第三方软件,如Excel、Matlab这样的;也可以自己编程,用Python、Perl等等,直接操作文件比较麻烦。

但对简单的处理,用大体量的软件或是写一段代码有点杀鸡用牛刀的感觉,这时,csvkit就有用武之地。

开始

安装csvkit

安装csvkit很简单:

pip3 install csvkit

我的系统是Python3.6,所以用pip3来安装,如果还在用Python2.7,就用pip install csvkit来进行安装。

为了方便后面的测试和解释,建议从官方下载测试样本文件:

curl -L -O  https://raw.githubusercontent.com/wireservice/csvkit/master/examples/realdata/ne_1033_data.xlsx

in2csv:Excel的杀手

下载的样本文件是一个Excel文件,谁愿意为了仅仅看两行数据而等待Excel漫长的启动界面呢?所以首先要将它转换为csv文件,转换也不用打开Excel,一条命令:

in2csv ne_1033_data.xlsx > data.csv

>是shell的重定向符,如果不重定向,in2csv会将转换之后的内容输出到控制台显示,现在我希望能保存为csv文件便于后续的操作,所以就将内容输出定向到data.csv文件中。

接下来看看data.csv的内容吧:

cat data.csv
cat 的输出原始而粗糙

csv文件内容有了,如果用cat的方式来看,既不方便也不美观,接下来我们用另一个工具查看

csvlook:数据潜望镜

这个文件有多少行呢,用cat data.csv | wc -l看了一下,有1037行,所以一屏肯定是看不完的,需要分页查看,而分页功能在类Unix系统上有现成的less可用。

csvlook data.csv | less -S
csvlook
csvlook

这样的显示就好多了,还可以方向键滚动查看,q退出,/搜索,等一系列less专用操作。

csvcut:数据手术刀

既然名字中带了一个cut,聪明的你肯定猜到了它的用途,不过放心,所有的操作都不会修改输入(原始文件),只会影响输出。

先看看这个数据有哪些列

csvcut -n data.csv
csvcut查看列标题
csvcut查看列标题

可以看到,总共有14列,在输出信息中,前面的数字是数字索引位置,默认是从1开始计数,后面的是列名称,我想只看感兴趣的几列数据(在这里我为了演示,只显示4行数据,所以加了head进行输出行数限定):

csvcut -c 2,5,6 data.csv | head -n 5
选择列
选择列

可以看到既可以用数字作为索引,也可以用列名称作为索引,所以上面的指令和下面这个指令是等价的

csvcut -c county,item_name,quantity data.csv | head -n 5

用管道进行组合

上面的输出不错,能否再显示得美观一点呢?答案是肯定的,将命令用管道组合起来就行了

csvcut -c county,item_name,quantity data.csv | csvlook | head
Putting it together with pipes
Putting it together with pipes

|管道是类Unix平台上的强大能力,如果不关心中间结果,甚至可以从头到尾都用管道进行连接,例如上面的命令改成如下方式,也是一样的结果

in2csv ne_1033_data.xlsx | csvcut -c county,item_name,quantity | csvlook | head

这样就省去了生成data.csv文件的中间过程。

数据分析

csvstat:无代码亦统计

使用csvlookcsvcut查看数据的切片只是探索数据的开始,在实践中,通常还需要一些计算和统计,csvstat的设计灵感来自编程语言 “R”summary()统计,它可以统计汇总一个CSV文件中的数据列。

csvcut -c county,acquisition_cost,ship_date data.csv | csvstat
命令行的*Summary*
命令行的*Summary*

不知道你有没有统计学基础?如果有的话,应该一目了然,唯一值、最小值、最大值、总计、均值、中位值、标准差……,大部分情况下够用了:)

csvgrep:找到需要的数据

仅仅按照列的方式过滤还是比较弱,还需要按照内容进行过滤,这时csvgrep就派上用场,例如,我们只想看兰开斯特的数据。

csvcut -c county,item_name,total_cost data.csv | csvgrep -c county -m LANCASTER | csvlook
基于列和内容过滤
基于列和内容过滤

csvgrep还支持正则表达式,关于正则表达式的讨论有点超出本篇范围,有兴趣可以查看系统工具grep的手册。

csvsort:秩序

前面显示出来的内容都很少,实际中往往都有成千上万行,所以排序功能很重要,我们试一下用csvsorttotal_cost列进行递减顺序:

csvcut -c county,item_name,total_cost data.csv | csvgrep -c county -m LANCASTER | csvsort -c total_cost -r | csvlook
按照总成本递减排列
按照总成本递减排列

宝刀屠龙

csvjoin:关联数据

在上面的数据中,有各个地区的武器装备信息,接下来想了解一个问题——装备有武器的地区中,哪里的人口最少?

原来的数据表不包含人口数量,所以下载一个包含人口信息的数据:

curl -L -O https://raw.githubusercontent.com/wireservice/csvkit/master/examples/realdata/acs2012_5yr_population.csv
各地区的人口数据
各地区的人口数据

两个数据表都包含fips字段,我们可以用这个字段来连接两个数据:

csvjoin -c fips data.csv acs2012_5yr_population.csv > joined.csv
csvcut -c county,item_name,total_population joined.csv | csvsort -c total_population | csvlook | head
两个小地区也有5.56毫米突击步枪
两个小地区也有5.56毫米突击步枪

csvstack:合并数据

数据经常会分散在不同地方,这时希望将一堆的csv文件合并成一个数据文件,csvstack可以帮助达成这个目标,一般来说csvstack需要同列同名的数据才可以合并。但是你知道,有时候即使两个csv文件有稍微的不同,也可以通过csvcut的列选择来获得同列同名的数据表。

# 获得堪萨斯州的测试数据
curl -L -O https://raw.githubusercontent.com/wireservice/csvkit/master/examples/realdata/ks_1033_data.csv
# 使用相同的文件名命名规则
in2csv ne_1033_data.xlsx > ne_1033_data.csv
# 合并两个文件到region.csv中
csvstack ne_1033_data.csv ks_1033_data.csv > region.csv
# 查看部分列的统计信息
csvstat -c state,acquisition_cost region.csv
合并两个州的数据
合并两个州的数据

csvsql, sql2csv:必杀技

有时,仅仅命令行是不够的,需要用SQL来进行数据的操作,csvsqlsql2csv就提供了数据库和csv之间的桥梁。

例如,我想将现在的csv文件转为数据库表

csvsql -i sqlite joined.csv
Sqlite数据表
Sqlite数据表

当然,我们可以一步到位,直接创建一个本地数据库:

csvsql --db sqlite:///leso.db --insert joined.csv
创建本地数据库文件leso.db
创建本地数据库文件leso.db

接下来,就可以利用数据库软件对这个数据库进行常规的SQL查询,当然也可以用CSVKIT提供的小工具sql2csv来进行查询。

sql2csv --db sqlite:///leso.db --query "select * from joined where total_population<1000;" | csvcut -c state,county,total_population | csvlook
SQL 查询
SQL 查询

如果SQL查询使用不频繁,何不直接在csv上执行SQL查询呢?

csvsql --query "select county,item_name,quantity from joined where quantity == 5;" joined.csv 2>/dev/null | csvlook
直接在csv文件上执行SQL查询
直接在csv文件上执行SQL查询

总结

由于我经常做数据处理的计算,所以磁盘上总是有大量的csv文件,用普通的文本编辑器打开非常缓慢不说,还不方便查询和检视,有了这套工具确实方便了很多。此外,它对中文的处理也还行,文件设置为UTF-8编码就好。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容