0


0

Ruby:複数の(大きな)ファイルを反復処理するより良い方法はありますか?

私がやっていることは次のとおりです(変数名は申し訳ありませんが、コードではそれらを使用していません):

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 Answer


1


意味がない場合は、openのブロック構文を使用する必要はありません。


0


このバージョンが2ファイルの場合にこれほど優れているかどうかはわかりませんが、ネストの深さはそれほど大きくありません。

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}