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閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容