【问题标题】:Getting (row count - 1) of CSV files获取(行数 - 1)的 CSV 文件
【发布时间】:2015-09-30 22:14:52
【问题描述】:

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

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

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

【问题讨论】:

  • 将行数放入一个变量中,并使用$((var - 1))将其减1。
  • CSV 允许字段中包含换行符,当发生这种情况时,它们将被包裹在引号中。对于特定的 CSV 是否合理取决于它所拥有的数据类型。编程语言中的 CSV 库通常会处理这个问题,在普通的 bash 中很难。

标签: python bash csv


【解决方案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 字符串视为要执行的程序。在这种情况下,我们通过“import”语句使csv 模块可用。然后,我们打印出行数减一。构造 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

【讨论】:

  • 哦,我喜欢这个。命令中的 c 选项是什么?这些文件最初是gz 压缩的。是否可以通过管道传输未压缩的文件并在 python 命令中使用它们,所有这些都在一行中完成?
  • @simplycoding 我更新了处理 gzip 文件的答案。另外,-c 选项告诉 python 将后面的字符串视为它的程序。
【解决方案2】:

要获取行数,只需使用算术表达式从wc 返回的值中减去 1

count=$(($(wc -l < filename.csv) - 1)

CSV 格式允许字段包含换行符,方法是用引号将字段括起来,例如

field1,field2,"field3 broken
across lines",field4

在普通的bash 脚本中处理这个问题会很困难(事实上,任何需要处理引用字段的 CSV 处理都是棘手的)。如果您需要处理 CSV 的全部通用性,您可能应该使用带有 CSV 库的编程语言。

但如果你知道你的 CSV 文件永远不会是这样的,你可以忽略它。

【讨论】:

    【解决方案3】:

    作为从总行数中减去一个的替代方法,您可以丢弃文件中之前的第一行

    row_count=$( { read; wc -l; } < filename.csv )
    

    (这绝不比简单地使用$(($(wc -l &lt; filename.csv) - 1)) 更好;这只是一个有用的技巧。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多