获取(行数 - 1)CSV文件

时间:2015-09-30 22:14:52

标签: python bash csv

主要有2个关于这个主题的问题:

  1. 我希望得到一些CSV文件的行数。在Bash,我知道我可以做wc -l < filename.csv。我该怎么做并从中减去1(因为标题)?

  2. 对于熟悉CSV文件的人以及抓取原始行数的可能问题,一条线被包裹在多条线上的可行性有多大?我知道这是一种非常可能的情况,但我想说这种情况从未发生过。如果有可能,使用Python的csv包会更好用吗?它是否基于分隔符和其他列包装器读取行?

3 个答案:

答案 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

gzipped文件

要在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))更好;这只是一个有用的技巧。)