csv中的行数不匹配

时间:2014-12-01 06:47:07

标签: ruby file

我有一个包含大量列的大型CSV。我正在尝试使用

计算行数
File.open(file).readlines.to_a.compact.count.to_i

虽然只有56行,但显示57。仔细检查后,我发现一条线的一部分被包裹起来形成下一条线。如何获得正确的计数?

1 个答案:

答案 0 :(得分:0)

  

仔细检查后,我发现一条线的一部分被包裹起来形成下一条线。如何获得正确的计数?

如果您希望我们提供超出通用答案的帮助,您需要显示传入数据的示例。

要解决此问题,您必须能够识别该行。我们无法帮助您,因为它看起来像任何东西。我猜测,其中一个列中有一个嵌入的换行符,这会强制换行。

该文件是一个真正的CSV文件,该列应该用双引号括起来,这样你可以在文件中搜索那些不以最后数据类型结尾的行列,然后读取下一行,加入它们,然后重写该文件。但是,我们再没有什么可以合作的,因为你的文件格式可能是很多不同的东西。

最好的办法是使用Ruby附带的CSV类,让它读取文件,而不是像文本文件一样对待它。 CSV文件是文本,但它们的格式设置为维护列和行,因此使用CSV类可以更好地获取数据。


查看您的代码:

有多种方法可以计算文件中的行数,包括最简单的行:

`wc -l /path/to/file`.to_i 

如果你正在使用* nix。

如果您的文件很大,使用File.open(file).readlines.to_a是非常多余的,不会很快或可扩展。

  • readlines返回一个数组。
  • to_a返回一个数组。

为什么要将数组转换为数组?

readlines将整个文件加载到内存中,然后将其在行末端拆分为数组。这个过程可能比简单地逐行读取文件和递增计数器慢得多,加上" slurping"如果文件大于可用内存,则可以使程序爬行。

参见" Why is "slurping" a file not a good practice?"了解更多信息。

compact从数组中删除nils。 readlines永远不会返回任何nils,因此compact将遍历数组,寻找不应该存在的内容。

  • count返回一个整数。
  • to_i将接收器转换为整数。

换句话说,to_i正在将整数转换为整数。为什么呢?

如果您想在Ruby中使用而不是使用wc -l,请执行简单快速的操作:

lines_in_file = 0
File.foreach(some_file) { lines_in_file += 1 }

运行之后,lines_in_file将包含读取的行数。记忆不会受到影响,它会像巨大的文件上的蓝色火焰一样运行。