Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:有没有更好的方法来迭代多个(大)文件?_Ruby_File_File Io_Refactoring - Fatal编程技术网

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

Ruby:有没有更好的方法来迭代多个(大)文件?,ruby,file,file-io,refactoring,Ruby,File,File Io,Refactoring,下面是我正在做的事情(对于变量名,我很抱歉,我没有在代码中使用这些名称): open_和_process方法只是打开文件并在完成后关闭它。这是摘自鹤嘴锄的书 无论如何,主要问题是代码嵌套太深。我无法将所有文件的内容加载到内存中,因此我必须逐行迭代。有更好的方法吗?或者至少美化一下它?我不确定这个版本对于两个文件的情况是否更好,但它的嵌套程度肯定没有那么深 outfiles = [1,2].map {|n| File.open("outfile#{n}.txt", 'w') } infiles =

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

open_和_process方法只是打开文件并在完成后关闭它。这是摘自鹤嘴锄的书


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

我不确定这个版本对于两个文件的情况是否更好,但它的嵌套程度肯定没有那么深

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}

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


我喜欢你所做的,但我同时访问了两行,因此如果我以这种方式使用它,我必须添加更多变量以保持两行读数之间的状态,这使得它太复杂了,我想如果我理解你的意思,在while循环的每个步骤中,这两行都可以同时访问,这两行将是一个两成员数组,其中包含每个输入文件中最近读取的行。
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}