Python和Javascript中不再有隨機(jī)腳本來轉(zhuǎn)換CSV或JSON數(shù)據(jù)。在本文中,Alvin Bryan向您展示了如何使用面粉廠主,一個小而強(qiáng)大的CLI工具,做你所有的數(shù)據(jù)處理。
請允許我在這篇文章的開頭說,我不是一個終端人。我不使用Vim。我發(fā)現(xiàn)一項Linux指令,可做文件內(nèi)的字符串查找,以及awk令人費解且違背直覺。我更喜歡在一個漂亮的用戶界面中看到我的文件。盡管如此,我還是養(yǎng)成了伸手拿東西的習(xí)慣命令行界面(CLI)當(dāng)我有小而專注的任務(wù)要完成時。為什么?我將在下面解釋這一切。在本文中,您還將學(xué)習(xí)如何使用名為面粉廠主操作CSV、TSV和/或JSON文件中的數(shù)據(jù)。
為什么使用命令行?
我在這里展示的一切都可以用普通代碼來完成。您可以加載文件,解析CSV數(shù)據(jù),然后使用常規(guī)Javascript、Python或任何其他語言對其進(jìn)行轉(zhuǎn)換。但是,每當(dāng)我需要轉(zhuǎn)換數(shù)據(jù)時,我都會使用命令行界面(CLI ),這有幾個原因:
- 更容易閱讀。
對于我來說,用Javascript或Python編寫腳本來處理日常數(shù)據(jù)會更快。但是,一個腳本可能會令人困惑。以我的經(jīng)驗來看,命令行操作最初很難編寫,但以后更容易閱讀。 - 更容易復(fù)制。
多虧了像家釀這樣的軟件包管理器,CLI的安裝比以前容易多了。不需要弄清楚Node.js或Python的正確版本,包管理器會幫你搞定。 - 年代久遠(yuǎn)。
與現(xiàn)代編程語言相比,CLI很古老。它們的變化比語言和框架慢得多。
米勒是什么?
我喜歡Miller的主要原因是它是一個獨立的工具。有許多很好的數(shù)據(jù)操作工具,但我發(fā)現(xiàn)的其他工具都是特定生態(tài)系統(tǒng)的一部分。用Python編寫的工具需要知道如何使用點和虛擬環(huán)境;對于那些寫在鐵銹上的,它是貨物,等等。
最重要的是,它很快。數(shù)據(jù)文件是流式的,而不是保存在內(nèi)存中,這意味著您可以在不凍結(jié)計算機(jī)的情況下對大文件執(zhí)行操作。
作為獎勵,米勒被積極維護(hù),約翰·克爾真正掌握公關(guān)和問題。作為一名開發(fā)人員,當(dāng)我看到一個整潔的、維護(hù)良好的開源項目并有很好的文檔時,我總是會有一種滿足感。
裝置
- Linux:apt-get安裝米勒或者公司自產(chǎn)自用。
- macOS:brew安裝米勒使用自制的。
- 窗口:喬科安裝米勒使用巧克力。
就這樣,現(xiàn)在您應(yīng)該有了最低貸款利率(minimum lending rate)終端中可用的命令。
奔跑mlr幫助主題看看是否有效。這將為您提供導(dǎo)航內(nèi)置文檔的說明。不過,你不應(yīng)該需要它;這就是這篇教程的目的!
怎么最低貸款利率(minimum lending rate)作品
米勒命令的工作方式如下:
MLR[輸入輸出文件格式][動詞][文件]
例子:mlr - csv濾鏡' $color!= "紅色" example.csv
我們來解構(gòu)一下:
- - csv指定輸入文件格式。這是一個CSV文件。
- 過濾器是我們在文件上所做的,在文檔中稱為“動詞”。在這種情況下,我們過濾掉沒有字段的每一行顏色干勁十足地開始做;毅然開始“紅色”。還有許多其他動詞,如分類和切口我們稍后會探討。
- 示例. csv就是我們正在操作的文件。
運營概述
我們可以利用這些動詞對數(shù)據(jù)運行特定的操作。我們可以做很多事情。我們來探索一下。
數(shù)據(jù)
我將使用以下數(shù)據(jù)集美國電視劇的IMDb收視率由《經(jīng)濟(jì)學(xué)人》創(chuàng)建。你可以下載這里或者在被賣方收回的汽車對于這篇文章。
注意:為了簡潔起見,我將該文件從mlr - csv頭。/IMDb _經(jīng)濟(jì)學(xué)家_電視_收視率. csv到電視_收視率. csv。
上面,我提到每個命令都包含一個特定的操作或動詞。讓我們學(xué)習(xí)第一個,叫做頭。它的作用是向您顯示文件的開頭(“頭”),而不是在控制臺中打印整個文件。
您可以運行以下命令:
mlr - csv頭。/tv_ratings.csv '
這是您將看到的輸出:
titleId,seasonNumber,片名,日期,av_rating,share,genrestt2879552,1,11.22.63,2016-03-10,8.489,0.51,《劇情,推理,科幻》tt3148266,1,12猴子,2015-02-27,8.3407,0.46,《冒險,劇情,推理》tt3148266,2,12猴子
這有點難讀,所以讓我們通過添加- opprint。
mlr - csv - opprint head。/電視_收視率. csv
結(jié)果輸出如下:
titleId seasonNumber標(biāo)題日期av_rating分享genrestt 2879552 1 11 . 22 . 63 2016-03-10 8.489 0.51劇情、推理、科幻3148266 1 12猴子2015-02-27 8.3407 0.46冒險、劇情、Mysterytt3148266 2 12猴子2016-05-30 8.8196 0.25冒險、冒險
好多了,不是嗎?
注意:而不是打字- csv - opprint每次,我們都可以使用- c2p選項,這是一種快捷方式。
鏈接
這就是樂趣的開始。與其運行多個命令,我們可以通過使用然后關(guān)鍵詞。
移除列
你可以看到有一個titleId不是很有用的專欄。讓我們使用切口動詞。
mlr - c2p cut -x -f titleId然后head。/電視_收視率. csv
它為您提供了以下輸出:
季節(jié)編號標(biāo)題日期av_rating分享體裁1 11.22.63 2016-03-10 8.489 0.51劇情、推理、科幻1 12猴子2015-02-27 8.3407 0.46冒險、劇情、推理2 12猴子2016-05-30 8.8196 0.25冒險、劇情、推理3 12猴子2017-05-19 9 9.0369 0.11
有趣的事實
我就是這樣第一次了解米勒的!我在玩CSV數(shù)據(jù)集它有一個無用的列,我查找“如何從CSV命令行刪除列”我發(fā)現(xiàn)了米勒,喜歡上了它,然后給《粉碎》雜志投了一篇文章?,F(xiàn)在我們在這里!
過濾器
這是我之前第一次展示的動詞。我們可以刪除所有不匹配特定表達(dá)式的行,讓我們只用幾個字符就可以清理數(shù)據(jù)。
如果我們只想要數(shù)據(jù)集中每個系列的第一季的評級,您可以這樣做:
mlr - c2p過濾器' $seasonNumber == 1 '然后頭。/電視_收視率. csv
整理
我們可以根據(jù)特定的列對數(shù)據(jù)進(jìn)行排序,就像在Excel或macOS Numbers這樣的UI中一樣。以下是根據(jù)評分最高的系列對數(shù)據(jù)進(jìn)行排序的方式:
mlr - c2p sort -nr av_rating然后head。/電視_收視率. csv
結(jié)果輸出如下:
標(biāo)題Id季節(jié)編號標(biāo)題日期av_rating份額genrestt父母身份1990-11-13 9.6824 1.68喜劇,戲劇0106028 6兇殺:街頭生活1997-12-05 9.6 0.13犯罪,戲劇,Mysterytt0108968 5被天使觸摸1998-11-15 9.6 0.08戲劇,家庭,幻想1994-02-23 9.4349 2.6戲劇、家庭、幻想0944947 4權(quán)力的游戲2014-05-09 9.4282 11.07動作、冒險、戲劇0976014 4希臘2011-03-07 9.4 0.01喜劇、戲劇0090466 4洛杉磯法1990-04-05 9.4 0.1戲劇
我們可以看到這一點親子關(guān)系,從1990年開始,在IMDb上有最高的評級——誰知道呢!
拯救我們的運營
默認(rèn)情況下,Miller只將您處理過的數(shù)據(jù)打印到控制臺。如果我們想把它保存到另一個CSV文件中,我們可以使用%3E接線員。
如果我們想將排序后的數(shù)據(jù)保存到一個新的CSV文件中,該命令應(yīng)該是這樣的:
mlr - csv排序-nr av_rating。/tv_ratings.csv %3E已排序. csv
將CSV轉(zhuǎn)換為JSON
大多數(shù)情況下,您不會在應(yīng)用程序中直接使用CSV數(shù)據(jù)。你把它轉(zhuǎn)換成一種更容易閱讀或者不需要額外依賴的格式,比如JSON。
米勒給了你- c2j選項將您的數(shù)據(jù)從CSV轉(zhuǎn)換為JSON。下面是如何對我們的排序數(shù)據(jù)執(zhí)行此操作:
mlr - c2j排序-nr av_rating。/tv_ratings.csv %3E sorted.json
案例研究:2016年里約奧運會獎牌數(shù)最多的前5名運動員
讓我們將上面學(xué)到的一切應(yīng)用到現(xiàn)實世界的用例中。假設(shè)你有一個參加2016年里約奧運會的每個運動員的詳細(xì)數(shù)據(jù)集,你想知道獎牌數(shù)最多的5個人是誰。
首先,以CSV格式下載運動員數(shù)據(jù),然后將其保存在名為運動員. csv。
讓我們打開以下文件:
mlr - c2p頭。/運動員. csv
產(chǎn)生的輸出將如下所示:
身份證姓名國籍性別出生日期身高體重體育金銀銅信息736041664 A耶穌加西亞ESP男1969-10-17 1.72 64田徑0 0 0 -532037425 A林新科女1986-09-23 1.68 56擊劍0 0 0 -435962603亞倫·布朗能男1992-05-27 1.98 79田徑00 1-5210415 鐵人三項0 0 -266237702亞倫·拉塞爾美國男1993-06-04 2.05 98排球0 1 -382571888艾倫·揚格澳大利亞男1991-09-25 1.93 100游泳0 0 -87689776阿烏里·洛雷納·博克薩ESP女1988-12-14 1.80 62田徑0 0 -
可選:清理文件
CSV文件有一些我們不需要的字段。讓我們通過移除信息,身份證明(identification),重量,以及出生日期列。
mlr - csv -I cut -x -f id,信息,體重,出生日期運動員. csv
現(xiàn)在我們可以轉(zhuǎn)移到我們最初的問題:我們想找到誰贏得了最多的獎牌。我們有多少每塊獎牌(銅牌、銀牌和金牌)運動員獲勝,但不是每位運動員的獎牌總數(shù)。
讓我們計算一個新值,叫做獎?wù)孪喈?dāng)于這個總數(shù)(青銅、白銀和黃金相加)。
mlr - c2p把“$獎牌= $銅牌+$銀牌+$金牌”放在頭上。/運動員. csv
它為您提供了以下輸出:
姓名國籍性別身高運動項目金牌銀牌銅牌lsA Jesus Garcia ESP男1.72田徑0 0 0 0A林新科女1.68擊劍0 0 0布朗坎男1.98田徑0 0 1 1阿倫庫克MDA男1.83跆拳道0 0 0 0阿倫蓋特NZL男1.81自行車0 0 0阿倫羅伊爾澳大利亞男1.80鐵人三項0 0 0 0阿倫拉塞爾美國男2.05排球0 1 1 1 1阿倫年輕澳大利亞男1.93游泳0 0 0Aauri Lorena Bokesa ESP女1.80田徑0 0 0Ababel Yeshaneh ETH女1.65田徑0 0 0 0
通過添加一個分類。
mlr - c2p放“$獎牌= $銅牌+$銀牌+$金牌”然后排序-nr獎牌\然后標(biāo)題。/運動員. csv
相應(yīng)地,結(jié)果輸出如下:
姓名國籍性別身高運動項目金牌銀牌銅牌邁克爾菲爾普斯美國男1.94花樣游泳5 1 0 6凱蒂萊德基美國女1.83花樣游泳4 1 0 5西蒙娜比爾斯美國女1.45體操4 0 1 5艾瑪麥克肯澳大利亞女1.80花樣游泳1 2 1 4卡廷卡霍斯祖亨女1.75花樣游泳3 1 0 4瑪?shù)铝盏侠嗝绹?.76花樣游泳2 1 1 4內(nèi)森阿德里安美國男1.99花樣游泳2 0 2 4佩內(nèi)利奧克西克坎女
通過添加以下內(nèi)容限制到前5名-n 5敬你的頭操作。
mlr - c2p放“$獎牌= $銅牌+$銀牌+$金牌”,然后排序-第n塊獎牌,然后是第n塊。/運動員. csv
您將得到以下文件:
姓名國籍性別身高運動項目金牌銀牌銅牌邁克爾菲爾普斯美國男1.94花樣游泳5 1 0 6凱蒂萊德基美國女1.83花樣游泳4 1 0 5西蒙娜比爾斯美國女1.45體操4 0 1 5艾瑪麥肯澳大利亞女1.80花樣游泳1 2 1 4卡廷卡霍斯祖洪女1.75花樣游泳3 1 0 4
最后一步,讓我們用- c2j選項。
這是我們最后的命令:
mlr - c2j填“$獎牌= $銅牌+$銀牌+$金牌”,然后排序-第n塊獎牌,然后是第n塊。/運動員. csv %3E top5.json
通過一條命令,我們已經(jīng)計算了新數(shù)據(jù),對結(jié)果進(jìn)行了排序、截斷,并將其轉(zhuǎn)換為JSON。
[ {“姓名”:“邁克爾·菲爾普斯”,“國籍”:“美國”,“性別”:“男性”,“身高”:1.94,“體重”:90,“運動”:“游泳”,“金牌”:5,“銀牌”:1,“銅牌”:0,“獎牌”:6 } //其他條目為簡潔起見省略。]
獎金:如果您想顯示前5名女性,您可以添加一個過濾器。
mlr - c2p放入“$獎牌= $銅牌+$銀牌+$金牌”,然后排序-nr獎牌,然后過濾“$性別== "女性”,然后head -n 5。/運動員. csv
您最終將得到以下輸出:
姓名國籍性別身高運動項目金牌銀牌銅牌凱蒂萊德基美國女1.83花樣游泳4 1 0 5西蒙妮比爾斯美國女1.45體操4 0 1 5艾瑪麥肯澳大利亞女1.80花樣游泳1 2 1 4卡廷卡霍斯祖洪女1.75花樣游泳3 1 0 4馬德琳迪拉多美國女1.76花樣游泳2 1 1 4