在命令行上查看漂亮的CSV

2020-11-01 20:26:55

CSV(逗号分隔值)文件之于数据格式就像FAT32之于文件系统:每个人都讨厌它们,但是你找不到更广泛支持的替代方案。

例如,在命令行环境中查看CSV文件通常非常烦人。你不可能从中赚到很多钱,对吗?

但是,如果您将两个常用命令行工具焊接在一起,则可以创建一个方便的查看器,使数据看起来如下所示:

有一个隐藏得很好的命令行工具,叫做";column&34;,它允许您在适当大小的列中很好地对齐数据。将它与Less之类的分页程序结合使用,我们已经有了一个很好的原型。

这样做的一个问题是,Column忽略/合并数据中的空单元格,这破坏了将所有数据对齐的全部意义。在Debian/Ubuntu上,Column提供了一个选项-n来禁用此行为,但对于其他平台(如Mac上的BSD风格的Column),我们需要一些额外的技巧。一个简单的解决方案是在每个逗号之前添加一个空格:

或者,如果您希望避免浪费太多的水平空间,可以只向空单元格添加空间,如下所示:

现在可以创建一些快捷方式并将其放入您的.bashrc、.bash_aliases或您最喜欢的shell提供的任何其他自定义选项中。这里我只介绍bash,因为那是我目前最常用的shell。

最后,我们将拥有一个工具Pretty_csv,它可以以不同的方式使用:

对data.csv|Pretty_CSV进行排序(为了说明输入不一定必须是文件,您还可以通过管道将另一个进程的输出传递给它)。

在Debian/Ubuntu系统上,我只是将其放在我的.bashrc中(注意一些额外的较少选项,大致基于git日志的工作方式):

函数Pretty_CSV{perl-pe';s/((?<;=,)|(?<;=^)),/,/g;';";$@";|column-t-s,|less-F-S-X-K}。

在我的Mac上,我使用iTerm2,我注意到它的shell集成以某种奇怪的方式与上面的bash函数冲突,如果我通过管道(cat data.csv|Pretty_CSV)应用它的话。

作为解决办法,我使用bash脚本而不是bash函数。例如,创建文件~/.bash.d/Pretty_csv.sh,其中包含:

#!/bin/bashperl-pe';s/((?<;=,)|(?<;=^)),/,/g;';";$@";|column-t-s,|exec less-F-S-X-K。

将其设置为可执行文件(chmod u+x~/.bash.d/Pretty_csv.sh)并为其创建bash别名(例如,在.bashrc或.bash_aliases中)。

我还经常使用TSV文件,其中的列由制表符分隔。这里的棘手之处在于将这个特殊字符正确地传递给管道的各个部分。

函数Pretty_TSV{column-t-s$';\t';-n";$@";|less-F-S-X-K}。

函数Pretty_TSV{perl-pe';s/((?<;=\t)|(?<;=^))\t/\t/g;';";$@";|column-t-s$';\t';|less-F-S-X-K}。

#!/bin/bashperl-pe';s/((?<;=\t)|(?<;=^))\t/\t/g;';";$@";|column-t-s$&39;\t&39;|exec less-F-S-X-K。

现在,您可以在您的终端中享受浏览漂亮、闪亮的CSV和TSV文件的温暖舒适的感觉。