8 个版本

0.2.4 2024年2月28日
0.2.3 2023年12月5日
0.1.4 2023年11月15日
0.1.3 2023年10月23日

#358 in 命令行工具

自定义许可证

24KB
180

Rust csvchk

分隔文本记录的垂直视图。

用法

使用 -h|--help 运行以读取用法

$ csvchk -h
Usage: csvchk [OPTIONS] [FILES]...

Arguments:
  [FILES]...  [default: -]

Options:
  -s, --separator <SEPARATOR>
  -l, --limit <LIMIT>          [default: 1]
  -n, --number
  -N, --no-headers
  -d, --dense
  -c, --columns <COLUMNS>
  -h, --help                   Print help
  -V, --version                Print version

默认输入为 STDIN

输入文件名的可选 "-" 表示 STDIN 是默认输入流

$ cat tests/inputs/books.csv | csvchk
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

$ csvchk - < tests/inputs/books.csv
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

默认限制为一条记录

默认情况下,程序将显示第一条记录

$ csvchk tests/inputs/books.csv
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

使用 -l|--limit 选项来指示更多记录

$ csvchk tests/inputs/books.csv --limit 2
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

// ****** Record 2 ******//
Author : Samuel Beckett
Year   : 1952
Title  : Waiting for Godot

如果您使用 0,则将显示所有记录

$ csvchk tests/inputs/books.csv --limit 0
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

// ****** Record 2 ******//
Author : Samuel Beckett
Year   : 1952
Title  : Waiting for Godot

// ****** Record 3 ******//
Author : Jules Verne
Year   : 1870
Title  : 20,000 Leagues Under the Sea

列编号

-n|--number 选项将显示从 1 开始的列号,适合与 awkcutcutr 进行字段选择。例如,如果我想提取出版年份

$ csvchk tests/inputs/books.tsv -n
// ****** Record 1 ******//
  1 Author : Émile Zola
  2 Year   : 1865
  3 Title  : La Confession de Claude

$ cut -f 2 tests/inputs/books.tsv
Year
1865
1952
1870

无标题

一些文件没有标题

$ cat tests/inputs/nohdr.csv
a,b,c
d,e,f
g,h,i

-N|--no-headers 选项将为 "Field*" 提供名称

$ csvchk --no-headers tests/inputs/nohdr.csv
// ****** Record 1 ******//
Field1 : a
Field2 : b
Field3 : c

定义/覆盖列名

使用 -c|--columns 提供自己的列名,例如在无标题文件的情况下

$ csvchk -c 1,2,3 tests/inputs/nohdr.csv
// ****** Record 1 ******//
1 : d
2 : e
3 : f

即使文件有标题,也可以覆盖列名

$ csvchk -c 1,2,3 tests/inputs/books.tsv
// ****** Record 1 ******//
1 : Émile Zola
2 : 1865
3 : La Confession de Claude

请注意,--no-headers 会将第一行视为数据行

$ csvchk -c 1,2,3 -N tests/inputs/books.tsv -l 2
// ****** Record 1 ******//
1 : Author
2 : Year
3 : Title

// ****** Record 2 ******//
1 : Émile Zola
2 : 1865
3 : La Confession de Claude

检测记录分隔符

这是一个 CSV 文件

$ cat tests/inputs/books.csv
Author,Year,Title
Émile Zola,1865,La Confession de Claude
Samuel Beckett,1952,Waiting for Godot
Jules Verne,1870,"20,000 Leagues Under the Sea"

它假设逗号分隔

$ csvchk tests/inputs/books.csv
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

这是一个制表符分隔的文件

$ cat tests/inputs/books.tsv
Author	Year	Title
Émile Zola	1865	La Confession de Claude
Samuel Beckett	1952	Waiting for Godot
Jules Verne	1870	20,000 Leagues Under the Sea

它工作正常

$ csvchk tests/inputs/books.tsv
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

指示分隔符

此文件使用分号

$ cat tests/inputs/books.txt
Author;Year;Title
Émile Zola;1865;La Confession de Claude
Samuel Beckett;1952;Waiting for Godot
Jules Verne;1870;20,000 Leagues Under the Sea

所以使用 -s|--separator 来指示

$ csvchk -s \; tests/inputs/books.txt
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

多个文件

当与多个文件一起运行时,将插入标题。注意以下运行中为每个输入文件猜测记录分隔符

$ csvchk tests/inputs/nohdr.csv tests/inputs/movies1.csv \
> tests/inputs/movies2.csv tests/inputs/movies2.tsv tests/inputs/books.tsv
==> tests/inputs/nohdr.csv <==
// ****** Record 1 ******//
a : d
b : e
c : f

==> tests/inputs/movies1.csv <==
// ****** Record 1 ******//
title    : The Blues Brothers
year     : 1980
director : John Landis

==> tests/inputs/movies2.csv <==
// ****** Record 1 ******//
title    : The Blues Brothers
year     : 1980
director : John Landis

==> tests/inputs/movies2.tsv <==
// ****** Record 1 ******//
title    : The Blues Brothers
year     : 1980
director : John Landis

==> tests/inputs/books.tsv <==
// ****** Record 1 ******//
Author : Émile Zola
Year   : 1865
Title  : La Confession de Claude

过滤

使用-g|--grep选项来查找匹配给定模式的文件

$ csvchk -g Hooper tests/inputs/movies2.csv
// ****** Record 2 ****** //
title    : Les Misérables
year     : 2012
director : Tom Hooper

默认情况下,使用区分大小写的匹配,所以搜索“hooper”将找不到任何结果。使用-i|--insensitive选项来解决这个问题

$ csvchk -g hooper -i tests/inputs/movies2.csv
// ****** Record 2 ****** //
title    : Les Misérables
year     : 2012
director : Tom Hooper

您可以使用正则表达式,例如,使用-l 0来查找后面跟着“l”或“r”的“b”,不区分大小写,以获取所有匹配项

$ csvchk --grep 'b[lr]' -i tests/inputs/movies2.csv -l 0`
// ****** Record 1 ****** //
title    : The Blues Brothers
year     : 1980
director : John Landis

// ****** Record 2 ****** //
title    : Les Misérables
year     : 2012
director : Tom Hooper

您也可以将正则表达式大写表示

$ csvchk --grep 'B[LR]' -i tests/inputs/movies2.csv -l 0`
// ****** Record 1 ****** //
title    : The Blues Brothers
year     : 1980
director : John Landis

// ****** Record 2 ****** //
title    : Les Misérables
year     : 2012
director : Tom Hooper

作者

Ken Youens-Clark [email protected]

依赖项

~27–43MB
~782K SLoC