CSVKIT——處理csv文件的瑞士軍刀

統計和數據處理都離不開csv文件,通常來講,操做csv都是依賴第三方軟件,如Excel、Matlab這樣的;也能夠本身編程,用Python、Perl等等,直接操做文件比較麻煩。git

但對簡單的處理,用大致量的軟件或是寫一段代碼有點殺雞用牛刀的感受,這時,csvkit就有用武之地。github

開始

安裝csvkit

安裝csvkit很簡單:正則表達式

pip3 install csvkit

個人系統是Python3.6,因此用pip3來安裝,若是還在用Python2.7,就用pip install csvkit來進行安裝。sql

爲了方便後面的測試和解釋,建議從官方下載測試樣本文件:shell

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的內容吧:less

cat data.csv

cat 的輸出原始而粗糙

csv文件內容有了,若是用cat的方式來看,既不方便也不美觀,接下來咱們用另外一個工具查看curl

csvlook:數據潛望鏡

這個文件有多少行呢,用cat data.csv | wc -l看了一下,有1037行,因此一屏確定是看不完的,須要分頁查看,而分頁功能在類Unix系統上有現成的less可用。編程語言

csvlook data.csv | less -S

csvlook

這樣的顯示就好多了,還能夠方向鍵滾動查看,q退出,/搜索,等一系列less專用操做。

csvcut:數據手術刀

既然名字中帶了一個cut,聰明的你確定猜到了它的用途,不過放心,全部的操做都不會修改輸入(原始文件),只會影響輸出。

先看看這個數據有哪些列

csvcut -n data.csv

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

|管道是類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*

不知道你有沒有統計學基礎?若是有的話,應該一目瞭然,惟一值、最小值、最大值、總計、均值、中位值、標準差……,大部分狀況下夠用了:)

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毫米突擊步槍

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數據表

固然,咱們能夠一步到位,直接建立一個本地數據庫:

csvsql --db sqlite:///leso.db --insert joined.csv

建立本地數據庫文件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查詢使用不頻繁,何不直接在csv上執行SQL查詢呢?

csvsql --query "select county,item_name,quantity from joined where quantity == 5;" joined.csv 2>/dev/null | csvlook

直接在csv文件上執行SQL查詢

總結

因爲我常常作數據處理的計算,因此磁盤上老是有大量的csv文件,用普通的文本編輯器打開很是緩慢不說,還不方便查詢和檢視,有了這套工具確實方便了不少。此外,它對中文的處理也還行,文件設置爲UTF-8編碼就好。

相關文章
相關標籤/搜索