在Ruby中同时处理两个文件

在Ruby中同时处理两个文件,ruby,Ruby,我想读取两个文本文件,并同时处理它们,如下所示: f1 = File.open(...) f2 = File.open(...) |f1, f2|.each do |l1,l2| ...... end 我怎样才能在Ruby中做到这一点呢?这对你有用吗 File.readlines(file1).each do |line_of_file1| File.readlines(file2).each do |line_of_file2| # Do stuff with the

我想读取两个文本文件,并同时处理它们,如下所示:

f1 = File.open(...)
f2 = File.open(...)

|f1, f2|.each do |l1,l2|
    ......
end

我怎样才能在Ruby中做到这一点呢?

这对你有用吗

File.readlines(file1).each do |line_of_file1|
  File.readlines(file2).each do |line_of_file2|
    # Do stuff with the lines
  end
end

一种天真的方法,假设文件的行数相同。这完全是手动的,但这个想法应该给你一些东西来建立:

f1 = File.open('foo.txt', 'r')
f2 = File.open('bar.txt', 'r')

while line1 = f1.gets && line2 = f2.gets
  print "File 1: #{line1}"
  print "File 2: #{line2}"
end

这将在两个文件中的任何一个用完行(如果一个文件比另一个文件短)时停止。很明显,这可能是你想要的,也可能不是你想要的。

如何避免与马特的答案相关的记忆消耗:

f1 = File.open(...)
f2 = File.open(...)

f1.each.zip(f2.each).each do |line1, line2|
  # Do something with the lines
end
是Enumerable中许多鲜为人知的方法之一,非常值得了解,特别是如果您对函数式编程范例感兴趣的话


它避免了与matt的答案相关的内存消耗,因为与其读取f1中的所有内容,
f1。每个
返回一个枚举数,您只能在需要时使用它。

您的意思是要单步执行并同时从每个文件中获得等效的行吗?还是别的?你的问题有点含糊不清:文件的行数相同吗?如果没有,会发生什么?为什么会有人投票结束这个问题?这不是世界上有史以来最激动人心、最具革命性的问题,但这是一个完全合理的问题(尽管有点不清楚——请参见我之前的评论)。如果文件1中有n行,文件2中有m行,则会有n*m个循环。取决于文件的大小
readlines
,可能会导致内存消耗。不是说这永远不合适,而是要记住一点。+1表示在一个紧凑表达式中三次使用
。值得一提的一个问题是:如果一个或另一个文件提前用完了行(也就是说,如果它较短),那么生成的压缩子数组将充满
nil
s,必须进行测试或以某种方式进行处理。无论您如何处理这个问题,都会出现这个问题,但我认为值得一提。@Telemachus:更糟糕的是,如果第一个文件提前用完了行,那么它将在不让您知道另一个文件仍然有行的情况下完成。
f1 = File.open('foo.txt', 'r')
f2 = File.open('bar.txt', 'r')

while line1 = f1.gets && line2 = f2.gets
  print "File 1: #{line1}"
  print "File 2: #{line2}"
end
f1 = File.open(...)
f2 = File.open(...)

f1.each.zip(f2.each).each do |line1, line2|
  # Do something with the lines
end