我有一个TSV文件,里面有一列。在那一列是一堆数字。该列有一个标题。
将该列中的所有数字合并为一个数组的最有效方法是什么? (比如2,000,000个数字)。
示例数据:
income 2000\n 80000\n 50000\n 30000\n
我试过了:
File.readlines(path)[1..-1].collect{|salary| salary.gsub("\n",'')}
我希望得到以下输出:
[2000,80000,50000,30000]
我有什么工作,但我不确定它是最有效的,因为我会在内存中读取一百万行。
答案 0 :(得分:1)
您可以使用CSV执行此操作,因为您只有一列,所以非常简单。
require 'csv'
CSV.read("/path/to/file.tsv").flatten
答案 1 :(得分:0)
您可以执行以下操作:
array = []
File.foreach('test.txt') do |line|
next if $. == 1
line.chomp!
array << line if line > ''
end
p array
将array
作为:
["2000", "80000", "50000", "30000"]
然而,这不是一个可扩展的解决方案。根据您的计算机,您可能会耗尽内存并使应用程序爬行。相反,我强烈建议使用一个简单的数据库来存储值,然后对其进行操作。数据库是为此类目的而设计的,速度极快。我建议使用Sequel gem。
$.
是一个特殊变量,用于跟踪上次读取文件的行号,因此,当foreach
将行传递到块中时,$.
将递增。这使得跳过特定的线条很容易。
array << line if line > ''
用于避免在输入文件包含尾随/终止行结束时附加空行/空行。