主要有2个关于这个主题的问题:
我希望得到一些CSV文件的行数。在Bash,我知道我可以做wc -l < filename.csv
。我该怎么做并从中减去1(因为标题)?
对于熟悉CSV文件的人以及抓取原始行数的可能问题,一条线被包裹在多条线上的可行性有多大?我知道这是一种非常可能的情况,但我想说这种情况从未发生过。如果有可能,使用Python的csv
包会更好用吗?它是否基于分隔符和其他列包装器读取行?
答案 0 :(得分:1)
要获取行数,只需使用算术表达式从wc
返回的值中减去1
count=$(($(wc -l < filename.csv) - 1)
CSV格式允许字段包含换行符,方法是用引号括起字段,例如
field1,field2,"field3 broken
across lines",field4
在普通bash
脚本中处理这个问题很困难(事实上,任何需要处理引用字段的CSV处理都很棘手)。如果您需要处理CSV的完整通用性,则应该使用带有CSV库的编程语言。
但如果你知道你的CSV文件永远不会是这样的话,你可以忽略它。
答案 1 :(得分:1)
正如Barmar所指出的,(1)CSV文件很可能包含行和(2)CSV编程库可以很好地处理这个问题。举个例子,这是一个python程序,它使用python的CSV模块来计算file.csv
减去1的行数:
python -c 'import csv; print( sum(1 for line in csv.reader(open("file.csv")))-1 )'
-c arg
选项告诉python将arg
字符串视为要执行的程序。在这种情况下,我们使用&#34; import&#34;使csv
模块可用。声明。然后,我们打印出行数减1。构造sum(1 for line in csv.reader(open("file.csv")))
一次计算一行。
如果您的csv文件具有非典型格式,则需要设置选项。这可能是分隔符或引号字符。有关详细信息,请参阅the documentation。
考虑这个测试文件:
$ cat file.csv
First name,Last name,Address
John,Smith,"P O Box 1234
Somewhere, State"
Jane,Doe,"Unknown"
此文件有两行加上标题。其中一行分为两行。 Python的csv模块正确地理解了这一点:
$ python -c 'import csv; print( sum(1 for line in csv.reader(open("file.csv")))-1 )'
2
要在python中打开gzip文件,我们使用gzip
模块:
$ python -c 'import csv, gzip; print( sum(1 for line in csv.reader(gzip.GzipFile("file.csv.gz")))-1 )'
2
答案 2 :(得分:0)
作为从总行数中减去一行的替代方法,您可以在文件之前丢弃第一行
row_count=$( { read; wc -l; } < filename.csv )
(这绝不比简单地使用$(($(wc -l < filename.csv) - 1))
更好;这只是一个有用的技巧。)