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

統(tǒng)計和數(shù)據(jù)處理都離不開csv文件窒舟,一般來說系忙,操作csv都是依賴第三方軟件,如Excel惠豺、Matlab這樣的银还;也可以自己編程,用Python耕腾、Perl等等见剩,直接操作文件比較麻煩杀糯。

但對簡單的處理扫俺,用大體量的軟件或是寫一段代碼有點殺雞用牛刀的感覺,這時固翰,csvkit就有用武之地狼纬。

開始

安裝csvkit

安裝csvkit很簡單:

pip3 install csvkit

我的系統(tǒng)是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文件盈简,誰愿意為了僅僅看兩行數(shù)據(jù)而等待Excel漫長的啟動界面呢?所以首先要將它轉(zhuǎn)換為csv文件,轉(zhuǎn)換也不用打開Excel柠贤,一條命令:

in2csv ne_1033_data.xlsx > data.csv

>是shell的重定向符香浩,如果不重定向,in2csv會將轉(zhuǎn)換之后的內(nèi)容輸出到控制臺顯示臼勉,現(xiàn)在我希望能保存為csv文件便于后續(xù)的操作邻吭,所以就將內(nèi)容輸出定向到data.csv文件中。

接下來看看data.csv的內(nèi)容吧:

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

csv文件內(nèi)容有了宴霸,如果用cat的方式來看囱晴,既不方便也不美觀,接下來我們用另一個工具查看

csvlook:數(shù)據(jù)潛望鏡

這個文件有多少行呢瓢谢,用cat data.csv | wc -l看了一下畸写,有1037行,所以一屏肯定是看不完的氓扛,需要分頁查看艺糜,而分頁功能在類Unix系統(tǒng)上有現(xiàn)成的less可用。

csvlook data.csv | less -S
csvlook
csvlook

這樣的顯示就好多了幢尚,還可以方向鍵滾動查看破停,q退出,/搜索尉剩,等一系列less專用操作真慢。

csvcut:數(shù)據(jù)手術(shù)刀

既然名字中帶了一個cut,聰明的你肯定猜到了它的用途理茎,不過放心黑界,所有的操作都不會修改輸入(原始文件),只會影響輸出皂林。

先看看這個數(shù)據(jù)有哪些列

csvcut -n data.csv
csvcut查看列標題
csvcut查看列標題

可以看到朗鸠,總共有14列,在輸出信息中础倍,前面的數(shù)字是數(shù)字索引位置烛占,默認是從1開始計數(shù),后面的是列名稱沟启,我想只看感興趣的幾列數(shù)據(jù)(在這里我為了演示忆家,只顯示4行數(shù)據(jù),所以加了head進行輸出行數(shù)限定):

csvcut -c 2,5,6 data.csv | head -n 5
選擇列
選擇列

可以看到既可以用數(shù)字作為索引德迹,也可以用列名稱作為索引芽卿,所以上面的指令和下面這個指令是等價的

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平臺上的強大能力称杨,如果不關(guān)心中間結(jié)果,甚至可以從頭到尾都用管道進行連接筷转,例如上面的命令改成如下方式列另,也是一樣的結(jié)果

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

這樣就省去了生成data.csv文件的中間過程。

數(shù)據(jù)分析

csvstat:無代碼亦統(tǒng)計

使用csvlookcsvcut查看數(shù)據(jù)的切片只是探索數(shù)據(jù)的開始旦装,在實踐中页衙,通常還需要一些計算和統(tǒng)計,csvstat的設(shè)計靈感來自編程語言 “R”summary()統(tǒng)計阴绢,它可以統(tǒng)計匯總一個CSV文件中的數(shù)據(jù)列店乐。

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

不知道你有沒有統(tǒng)計學(xué)基礎(chǔ)?如果有的話呻袭,應(yīng)該一目了然眨八,唯一值、最小值左电、最大值廉侧、總計、均值篓足、中位值段誊、標準差……,大部分情況下夠用了:)

csvgrep:找到需要的數(shù)據(jù)

僅僅按照列的方式過濾還是比較弱栈拖,還需要按照內(nèi)容進行過濾连舍,這時csvgrep就派上用場,例如涩哟,我們只想看蘭開斯特的數(shù)據(jù)索赏。

csvcut -c county,item_name,total_cost data.csv | csvgrep -c county -m LANCASTER | csvlook
基于列和內(nèi)容過濾
基于列和內(nèi)容過濾

csvgrep還支持正則表達式,關(guān)于正則表達式的討論有點超出本篇范圍贴彼,有興趣可以查看系統(tǒng)工具grep的手冊潜腻。

csvsort:秩序

前面顯示出來的內(nèi)容都很少,實際中往往都有成千上萬行器仗,所以排序功能很重要融涣,我們試一下用csvsorttotal_cost列進行遞減順序:

csvcut -c county,item_name,total_cost data.csv | csvgrep -c county -m LANCASTER | csvsort -c total_cost -r | csvlook
按照總成本遞減排列
按照總成本遞減排列

寶刀屠龍

csvjoin:關(guān)聯(lián)數(shù)據(jù)

在上面的數(shù)據(jù)中,有各個地區(qū)的武器裝備信息青灼,接下來想了解一個問題——裝備有武器的地區(qū)中暴心,哪里的人口最少?

原來的數(shù)據(jù)表不包含人口數(shù)量杂拨,所以下載一個包含人口信息的數(shù)據(jù):

curl -L -O https://raw.githubusercontent.com/wireservice/csvkit/master/examples/realdata/acs2012_5yr_population.csv
各地區(qū)的人口數(shù)據(jù)
各地區(qū)的人口數(shù)據(jù)

兩個數(shù)據(jù)表都包含fips字段,我們可以用這個字段來連接兩個數(shù)據(jù):

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
兩個小地區(qū)也有5.56毫米突擊步槍
兩個小地區(qū)也有5.56毫米突擊步槍

csvstack:合并數(shù)據(jù)

數(shù)據(jù)經(jīng)常會分散在不同地方悯衬,這時希望將一堆的csv文件合并成一個數(shù)據(jù)文件弹沽,csvstack可以幫助達成這個目標檀夹,一般來說csvstack需要同列同名的數(shù)據(jù)才可以合并。但是你知道策橘,有時候即使兩個csv文件有稍微的不同炸渡,也可以通過csvcut的列選擇來獲得同列同名的數(shù)據(jù)表。

# 獲得堪薩斯州的測試數(shù)據(jù)
curl -L -O https://raw.githubusercontent.com/wireservice/csvkit/master/examples/realdata/ks_1033_data.csv
# 使用相同的文件名命名規(guī)則
in2csv ne_1033_data.xlsx > ne_1033_data.csv
# 合并兩個文件到region.csv中
csvstack ne_1033_data.csv ks_1033_data.csv > region.csv
# 查看部分列的統(tǒng)計信息
csvstat -c state,acquisition_cost region.csv
合并兩個州的數(shù)據(jù)
合并兩個州的數(shù)據(jù)

csvsql, sql2csv:必殺技

有時丽已,僅僅命令行是不夠的蚌堵,需要用SQL來進行數(shù)據(jù)的操作,csvsqlsql2csv就提供了數(shù)據(jù)庫和csv之間的橋梁沛婴。

例如吼畏,我想將現(xiàn)在的csv文件轉(zhuǎn)為數(shù)據(jù)庫表

csvsql -i sqlite joined.csv
Sqlite數(shù)據(jù)表
Sqlite數(shù)據(jù)表

當然,我們可以一步到位嘁灯,直接創(chuàng)建一個本地數(shù)據(jù)庫:

csvsql --db sqlite:///leso.db --insert joined.csv
創(chuàng)建本地數(shù)據(jù)庫文件leso.db
創(chuàng)建本地數(shù)據(jù)庫文件leso.db

接下來泻蚊,就可以利用數(shù)據(jù)庫軟件對這個數(shù)據(jù)庫進行常規(guī)的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上執(zhí)行SQL查詢呢?

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

總結(jié)

由于我經(jīng)常做數(shù)據(jù)處理的計算羹奉,所以磁盤上總是有大量的csv文件秒旋,用普通的文本編輯器打開非常緩慢不說,還不方便查詢和檢視诀拭,有了這套工具確實方便了很多滩褥。此外,它對中文的處理也還行炫加,文件設(shè)置為UTF-8編碼就好瑰煎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俗孝,隨后出現(xiàn)的幾起案子酒甸,更是在濱河造成了極大的恐慌,老刑警劉巖赋铝,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件插勤,死亡現(xiàn)場離奇詭異,居然都是意外死亡革骨,警方通過查閱死者的電腦和手機农尖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來良哲,“玉大人盛卡,你說我怎么就攤上這事≈欤” “怎么了滑沧?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵并村,是天一觀的道長。 經(jīng)常有香客問我滓技,道長哩牍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任令漂,我火速辦了婚禮膝昆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叠必。我一直安慰自己荚孵,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布挠唆。 她就那樣靜靜地躺著处窥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玄组。 梳的紋絲不亂的頭發(fā)上滔驾,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音俄讹,去河邊找鬼哆致。 笑死,一個胖子當著我的面吹牛患膛,可吹牛的內(nèi)容都是我干的摊阀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踪蹬,長吁一口氣:“原來是場噩夢啊……” “哼胞此!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跃捣,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤漱牵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疚漆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酣胀,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年娶聘,在試婚紗的時候發(fā)現(xiàn)自己被綠了闻镶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丸升,死狀恐怖铆农,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情发钝,我是刑警寧澤顿涣,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布波闹,位于F島的核電站酝豪,受9級特大地震影響涛碑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孵淘,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一蒲障、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘫证,春花似錦揉阎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毡庆,卻和暖如春坑赡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背么抗。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工毅否, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝇刀。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓螟加,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吞琐。 傳聞我的和親對象是個殘疾皇子捆探,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容