我有一个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。
答案 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远远超出您使用该驱动器的程度。考虑操作系统在一秒钟内写入设备的频率;你的代码只是一滴水。