从命令行查看表格文件,如CSV

有人知道Linux/OS X的命令行CSV查看器吗?我正在考虑类似less的东西,但它以一种更可读的方式分隔列。(我可以用OpenOffice Calc或Excel打开它,但这对于我需要的数据来说太过强大了。)有水平和垂直滚动会很棒。

344632 次浏览

这里有一个(可能太)简单的选择:

sed "s/,/\t/g" filename.csv | less
Ofri的回答给了你想要的一切。 但. .如果你不想记住这个命令,你可以把它添加到你的~/。Bashrc(或等效):

csview()
{
local file="$1"
sed "s/,/\t/g" "$file" | less -S
}

这与Ofri的答案完全相同,除了我已经将它包装在shell函数中,并且正在使用less -S选项来停止行包装(使less的行为更像office/oocalc)。

打开一个新的shell(或在当前shell中键入source ~/.bashrc)并使用以下命令运行命令:

csview <filename>

你可以安装csvtool(在Ubuntu上)

sudo apt-get install csvtool

然后运行:

csvtool readable filename | view -

这将使它在只读的vim实例中非常漂亮,即使您有一些具有非常长的值的单元格。

使用TxtSushi你可以做到:

csvtopretty filename.csv | less -S

我写了这个csv_view.sh来从命令行格式化csv,这读取整个文件来找出每列的最佳宽度(需要perl,假设字段中没有逗号,也使用较少):


#!/bin/bash


perl -we '
sub max( @ ) {
my $max = shift;


map { $max = $_ if $_ > $max } @_;
return $max;
}


sub transpose( @ ) {
my @matrix = @_;
my $width  = scalar @{ $matrix[ 0 ] };
my $height = scalar @matrix;


return map { my $x = $_; [ map { $matrix[ $_ ][ $x ] } 0 .. $height - 1 ] } 0 .. $width - 1;
}


# Read all lines, as arrays of fields
my @lines = map { s/\r?\n$//; [ split /,/ ] } ;


my $widths =
# Build a pack expression based on column lengths
join "",


# For each column get the longest length plus 1
map { 'A' . ( 1 + max map { length } @$_ ) }


# Get arrays of columns
transpose


@lines
;


# Format all lines with pack
map { print pack( $widths, @$_ ) . "\n" } @lines;
' $1 | less -NS


你也可以用这个:

column -s, -t < somefile.csv | less -#2 -N -S

column是一个标准的unix程序,非常方便——它可以找到每一列的适当宽度,并将文本显示为格式良好的表格。

注意:无论何时有空字段,都需要在其中放置某种占位符,否则该列将与后面的列合并。下面的例子演示了如何使用sed插入占位符:

$ cat data.csv
1,2,3,4,5
1,,,,5
$ sed 's/,,/, ,/g;s/,,/, ,/g' data.csv | column -s, -t
1  2  3  4  5
1           5
$ cat data.csv
1,2,3,4,5
1,,,,5
$ column -s, -t < data.csv
1  2  3  4  5
1  5
$ sed 's/,,/, ,/g;s/,,/, ,/g' data.csv | column -s, -t
1  2  3  4  5
1           5

注意,用,,替换, ,做了两次。如果你只做一次,1,,,4将变成1, ,,4,因为第二个逗号已经匹配了。

如果你是一个vimmer,使用CSV插件,它非常漂亮:

beautiful

看看csvkit。它提供了一组遵循UNIX哲学的工具(这意味着它们很小、简单、用途单一,并且可以组合使用)。

下面是一个例子,它从免费的Maxmind世界城市数据库中提取了德国十个人口最多的城市,并以控制台可读的格式显示结果:

$ csvgrep -e iso-8859-1 -c 1 -m "de" worldcitiespop | csvgrep -c 5 -r "\d+"
| csvsort -r -c 5 -l | csvcut -c 1,2,4,6 | head -n 11 | csvlook
-----------------------------------------------------
|  line_number | Country | AccentCity | Population  |
-----------------------------------------------------
|  1           | de      | Berlin     | 3398362     |
|  2           | de      | Hamburg    | 1733846     |
|  3           | de      | Munich     | 1246133     |
|  4           | de      | Cologne    | 968823      |
|  5           | de      | Frankfurt  | 648034      |
|  6           | de      | Dortmund   | 594255      |
|  7           | de      | Stuttgart  | 591688      |
|  8           | de      | Düsseldorf | 577139      |
|  9           | de      | Essen      | 576914      |
|  10          | de      | Bremen     | 546429      |
-----------------------------------------------------

Csvkit是平台独立的,因为它是用Python编写的。

为此,我在Groovy中编写了一个脚本viewtab。你可以这样调用它:

viewtab filename.csv

它基本上是一个超轻量级的电子表格,可以从命令行调用,处理CSV和制表符分离的文件,可以读取Excel和Numbers阻塞的非常大的文件,并且非常快。从纯文本的意义上讲,它不是命令行,但它是独立于平台的,可能适合许多人在命令行环境中寻找快速检查许多或大型CSV文件的解决方案。

脚本和如何安装它描述在这里:

http://bayesianconspiracy.blogspot.com/2012/06/quick-csvtab-file-viewer.html

Tabview:轻量级的python curses命令行CSV文件查看器(以及其他表格式python数据,如列表中的列表)位于Github

特点:

  • Python 2.7+, 3.x
  • Unicode支持
  • 类似电子表格的视图,方便地可视化表格数据
  • Vim-like navigation (h,j,k,l, g(上),g(下),12G goto line 12, m- mark, ' - goto标记,等等)
  • 切换持久标题行
  • 动态调整列的宽度和间隙
  • 按任意列升序或降序排序。数值的“自然”顺序排序。
  • 全文搜索,n和p之间循环搜索结果
  • “Enter”查看完整的单元格内容
  • 将单元格内容拉到剪贴板
  • F1还是?的快捷键
  • 也可以使用从python命令行可视化任何表格数据(例如: 李链表的链表)< / >

在python中有一个简短的命令行脚本:https://github.com/rgrp/csv2ascii/blob/master/csv2ascii.py

只需下载并放置在您的路径。用法就像

csv2ascii.py [options] csv-file-path
将csv文件csv-file-path转换为ascii格式,返回结果 stdout。如果csv-file-path = '-',则从stdin读取

选项:

-h, --help            show this help message and exit
-w WIDTH, --width=WIDTH
Width of ascii output
-c COLUMNS, --columns=COLUMNS
Only display this number of columns

我用pisswillis的答案用了很长时间。

csview()
{
local file="$1"
sed "s/,/\t/g" "$file" | less -S
}

但随后结合了一些代码,我在http://chrisjean.com/2011/06/17/view-csv-data-from-the-command-line发现,这对我来说更好:

csview()
{
local file="$1"
cat "$file" | sed -e 's/,,/, ,/g' | column -s, -t | less -#5 -N -S
}

对我来说,它工作得更好的原因是它能更好地处理宽列。

制表机包中的tblless包装了unix column命令,并对数值列进行对齐。

xsv不仅仅是一个查看器。我推荐它用于命令行上的大多数CSV任务,特别是在处理大型数据集时。

nodejs包tecfu / tty-table可以被全局安装来精确地做到这一点:

apt-get install nodejs
npm i -g tty-table
cat data.csv | tty-table

tecfu/tty-table

它还可以处理流。

有关更多信息,请参见这里是终端使用文档

另一个多功能的CSV操作工具:米勒。从它自己的描述来看,它类似于名称索引数据(如CSV、TSV和表格JSON)的awk、sed、cut、join和sort。(链接到github仓库:https://github.com/johnkerl/miller)

我为这些(和其他)目的创建了tablign。安装与

pip install tablign

而且

$ cat test.csv
Header1,Header2,Header3
Pizza,Artichoke dip,Bob's Special of the Day
BLT,Ham on rye with the works,
$ tablign test.csv
Header1 , Header2                   , Header3
Pizza   , Artichoke dip             , Bob's Special of the Day
BLT     , Ham on rye with the works ,

如果数据由逗号以外的其他东西分隔,也适用。最重要的是,它保存分隔符,所以你也可以用它来样式你的ASCII表,而不牺牲你的[Markdown,CSV,LaTeX]语法。

Tabview真的很好。工作200+MB的文件,显示很好,这是与LibreOffice的bug,以及在gvim的csv插件。

Anaconda版本可以在这里找到:https://anaconda.org/bioconda/tabview