Python和Javascript中不再有随机脚本来转换CSV或JSON数据。在本文中,Alvin Bryan向您展示了如何使用面粉厂主,一个小而强大的CLI工具,做你所有的数据处理。
请允许我在这篇文章的开头说,我不是一个终端人。我不使用Vim。我发现一项Linux指令,可做文件内的字符串查找,以及awk令人费解且违背直觉。我更喜欢在一个漂亮的用户界面中看到我的文件。尽管如此,我还是养成了伸手拿东西的习惯命令行界面(CLI)当我有小而专注的任务要完成时。为什么?我将在下面解释这一切。在本文中,您还将学习如何使用名为面粉厂主操作CSV、TSV和/或JSON文件中的数据。
为什么使用命令行?
我在这里展示的一切都可以用普通代码来完成。您可以加载文件,解析CSV数据,然后使用常规Javascript、Python或任何其他语言对其进行转换。但是,每当我需要转换数据时,我都会使用命令行界面(CLI ),这有几个原因:
- 更容易阅读。
对于我来说,用Javascript或Python编写脚本来处理日常数据会更快。但是,一个脚本可能会令人困惑。以我的经验来看,命令行操作最初很难编写,但以后更容易阅读。 - 更容易复制。
多亏了像家酿这样的软件包管理器,CLI的安装比以前容易多了。不需要弄清楚Node.js或Python的正确版本,包管理器会帮你搞定。 - 年代久远。
与现代编程语言相比,CLI很古老。它们的变化比语言和框架慢得多。
米勒是什么?
我喜欢Miller的主要原因是它是一个独立的工具。有许多很好的数据操作工具,但我发现的其他工具都是特定生态系统的一部分。用Python编写的工具需要知道如何使用点和虚拟环境;对于那些写在铁锈上的,它是货物,等等。
最重要的是,它很快。数据文件是流式的,而不是保存在内存中,这意味着您可以在不冻结计算机的情况下对大文件执行操作。
作为奖励,米勒被积极维护,约翰·克尔真正掌握公关和问题。作为一名开发人员,当我看到一个整洁的、维护良好的开源项目并有很好的文档时,我总是会有一种满足感。
装置
- Linux:apt-get安装米勒或者公司自产自用。
- macOS:brew安装米勒使用自制的。
- 窗口:乔科安装米勒使用巧克力。
就这样,现在您应该有了最低贷款利率(minimum lending rate)终端中可用的命令。
奔跑mlr帮助主题看看是否有效。这将为您提供导航内置文档的说明。不过,你不应该需要它;这就是这篇教程的目的!
怎么最低贷款利率(minimum lending rate)作品
米勒命令的工作方式如下:
MLR[输入输出文件格式][动词][文件]
例子:mlr - csv滤镜' $color!= "红色" example.csv
我们来解构一下:
- - csv指定输入文件格式。这是一个CSV文件。
- 过滤器是我们在文件上所做的,在文档中称为“动词”。在这种情况下,我们过滤掉没有字段的每一行颜色干劲十足地开始做;毅然开始“红色”。还有许多其他动词,如分类和切口我们稍后会探讨。
- 示例. csv就是我们正在操作的文件。
运营概述
我们可以利用这些动词对数据运行特定的操作。我们可以做很多事情。我们来探索一下。
数据
我将使用以下数据集美国电视剧的IMDb收视率由《经济学人》创建。你可以下载这里或者在被卖方收回的汽车对于这篇文章。
注意:为了简洁起见,我将该文件从mlr - csv头。/IMDb _经济学家_电视_收视率. csv到电视_收视率. csv。
上面,我提到每个命令都包含一个特定的操作或动词。让我们学习第一个,叫做头。它的作用是向您显示文件的开头(“头”),而不是在控制台中打印整个文件。
您可以运行以下命令:
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
结果输出如下:
titleId seasonNumber标题日期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选项,这是一种快捷方式。
链接
这就是乐趣的开始。与其运行多个命令,我们可以通过使用然后关键词。
移除列
你可以看到有一个titleId不是很有用的专栏。让我们使用切口动词。
mlr - c2p cut -x -f titleId然后head。/电视_收视率. csv
它为您提供了以下输出:
季节编号标题日期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数据集它有一个无用的列,我查找“如何从CSV命令行删除列”我发现了米勒,喜欢上了它,然后给《粉碎》杂志投了一篇文章。现在我们在这里!
过滤器
这是我之前第一次展示的动词。我们可以删除所有不匹配特定表达式的行,让我们只用几个字符就可以清理数据。
如果我们只想要数据集中每个系列的第一季的评级,您可以这样做:
mlr - c2p过滤器' $seasonNumber == 1 '然后头。/电视_收视率. csv
整理
我们可以根据特定的列对数据进行排序,就像在Excel或macOS Numbers这样的UI中一样。以下是根据评分最高的系列对数据进行排序的方式:
mlr - c2p sort -nr av_rating然后head。/电视_收视率. csv
结果输出如下:
标题Id季节编号标题日期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权力的游戏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戏剧
我们可以看到这一点亲子关系,从1990年开始,在IMDb上有最高的评级——谁知道呢!
拯救我们的运营
默认情况下,Miller只将您处理过的数据打印到控制台。如果我们想把它保存到另一个CSV文件中,我们可以使用%3E接线员。
如果我们想将排序后的数据保存到一个新的CSV文件中,该命令应该是这样的:
mlr - csv排序-nr av_rating。/tv_ratings.csv %3E已排序. csv
将CSV转换为JSON
大多数情况下,您不会在应用程序中直接使用CSV数据。你把它转换成一种更容易阅读或者不需要额外依赖的格式,比如JSON。
米勒给了你- c2j选项将您的数据从CSV转换为JSON。下面是如何对我们的排序数据执行此操作:
mlr - c2j排序-nr av_rating。/tv_ratings.csv %3E sorted.json
案例研究:2016年里约奥运会奖牌数最多的前5名运动员
让我们将上面学到的一切应用到现实世界的用例中。假设你有一个参加2016年里约奥运会的每个运动员的详细数据集,你想知道奖牌数最多的5个人是谁。
首先,以CSV格式下载运动员数据,然后将其保存在名为运动员. csv。
让我们打开以下文件:
mlr - c2p头。/运动员. csv
产生的输出将如下所示:
身份证姓名国籍性别出生日期身高体重体育金银铜信息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
现在我们可以转移到我们最初的问题:我们想找到谁赢得了最多的奖牌。我们有多少每块奖牌(铜牌、银牌和金牌)运动员获胜,但不是每位运动员的奖牌总数。
让我们计算一个新值,叫做奖章相当于这个总数(青铜、白银和黄金相加)。
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奖牌\然后标题。/运动员. 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玛德琳迪拉多美国女1.76花样游泳2 1 1 4内森阿德里安美国男1.99花样游泳2 0 2 4佩内利奥克西克坎女
通过添加以下内容限制到前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
通过一条命令,我们已经计算了新数据,对结果进行了排序、截断,并将其转换为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