2010-04-15 5 views
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 просто открыть файл и закрыть его, как только это сделано. Это взято из книги кирки.

В любом случае основная проблема заключается в том, что код вложен слишком глубоко. Я не могу загрузить все содержимое файлов в память, поэтому мне нужно итерации по очереди. Есть лучший способ сделать это? Или, по крайней мере, преувеличить его?

ответ

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} 
+0

мне нравится то, что вы сделали, но я доступ к обеим линиям одновременно, поэтому, если бы я использовал его таким образом, мне пришлось бы добавить больше переменных, чтобы поддерживать состояние между чтением каждой из двух строк, и это делает его слишком сложным. Думаю – zxcvbnm

+0

Если я понимаю, что вы говорите, строки оба одновременно доступны одновременно - на каждом шаге цикла while строки будут представлять собой массив из двух элементов, содержащий последний прочитанный li ne из каждого входного файла. –

Смежные вопросы