Ruby:有没有更好的方法来迭代多个(大)文件?

时间:2010-04-15 00:52:04

标签: ruby file file-io refactoring

这就是我正在做的事情(抱歉变量名称,我没有在我的代码中使用这些名称):

File.open("out_file_1.txt", "w") do |out_1|
  File.open("out_file_2.txt", "w") do |out_2|
    File.open_and_process("in_file_1.txt", "r") do |in_1|
      File.open_and_process("in_file_2.txt", "r") do |in_2|
        while line_1 = in_1.gets do
          line_2 = in_2.gets        #input files have the same number of lines
          #process data and output to files
        end
      end
    end
  end
end

open_and_process方法只是打开文件并在完成后关闭它。它来自镐书。

无论如何,主要问题是代码嵌套太深。我无法将所有文件的内容加载到内存中,因此我必须逐行迭代。有一个更好的方法吗?或者至少美化它?

2 个答案:

答案 0 :(得分:1)

在没有意义的情况下,您不需要使用open的块语法

http://ruby-doc.org/core/classes/IO.html#M002239

答案 1 :(得分:0)

我不确定这个版本对于双文件的情况好多了,但它的嵌套肯定不那么深。

outfiles = [1,2].map {|n| File.open("outfile#{n}.txt", 'w') }
infiles =  [1,2].map {|n| File.open("infile#{n}.txt", "r")}
while (lines = infiles.map {|f| f.gets})).all?
  lines.each_with_index {|l, n| outfiles[n].puts("processed #{l}")}
end
(outfiles + infiles).each {|f| f.close}