在Ruby中编辑一个巨大的文件

时间:2015-03-09 14:34:46

标签: ruby

我有一个86MB的CSV,我试图解析它以减小其大小,但我的代码不起作用。当我将输入文件更改为另一个文件时,它完美地工作。我错过了一些明显的东西吗?

arr=Array.new
File.open('regressionModels.csv').each{|x|
puts x #for testing only
if(!(x.include?"NA"))
    arr.push(x)
end 
}
File.open('regressionModelsCleaned.csv','w').puts arr.join("\n")

编辑:添加此行以确保文件存在:

puts File.file?('regressionModels.csv') 

注意:我正在尝试使用该阵列,因为我试图更少地写入我的SSD。

2 个答案:

答案 0 :(得分:0)

使用延迟枚举可能会帮助您解决问题。您可以执行以下操作:

File.open('clean.csv', 'w') do |clean|
  File.open('dirty.csv').lazy.each do |dirty|
    clean.write(dirty) unless dirty.include? "NA"
  end
end

也没有必要建立一个中间数组(这可能也会导致你的问题)。您可以打开这两个文件,然后在循环显示旧文件时从新文件中写入。

答案 1 :(得分:0)

如果我不需要防止子串命中,我会使用类似的东西:

File.open('regressionModelsCleaned.csv', 'w') do |file_out|
  File.foreach('regressionModels.csv') do |csv_line|
    file_out.puts csv_line if csv_line['NA']
  end
end

我不担心将匹配的行聚合到一个数组中。 SSD的MTBF远远超出您使用该驱动器的程度。考虑操作系统在一秒钟内写入设备的频率;你的代码只是一滴水。