循环遍历两个文件Ruby

时间:2013-10-28 14:23:01

标签: ruby file loops

同时迭代两个文件的最佳方法是什么,如果file_1 =='x'中的第57行然后以这种方式处理file_2中的第57行?

我的代码不起作用,但我知道有一个简单的解决方案......

@blue = []
@red = []

file_1 = File.open('index.txt', 'r')
file_2 = File.open('index2.txt', 'r')

for item, line in file_1, file_2
   @blue << line if item == "blue"
   @red << line if item == "red"
end

file_1.close
file_2.close

3 个答案:

答案 0 :(得分:4)

从不这是一个很好的做法,可以在go中读取整个文件并将其放在变量中。

对于你的问题,需要同时读取两个文件,我会建议这个(不需要任何空间开销):

@blue = []
@red = []
#make the files enumerable. 
file_1 = File.open('index.txt', 'r').to_enum
file_2 = File.open('index2.txt', 'r').to_enum

loop do
  #access next line in each file with .next
  item = file_1.next
  line = file_2.next
  @blue << line if item.eql?('blue')
  @red  << line if item.eql?('red')
end

file_1.close
file_2.close

to_enum在对象上调用时,使其可枚举并为其配备几个枚举器功能。 #next是其中一种内置方法。

上面的代码逐个从每个文件中读取一行;只要任何文件超出下一个输入,循环就会终止。

答案 1 :(得分:2)

我确信有更好的方法,但它可以在文件上调用IO#readlines,并zip就像这样:

for item, line in file_1.readlines.zip(file_2.readlines)

只要文件不是太大(即非常大),完整阅读它们就没有问题。您可能希望事先检查文件的行数是否相同,以避免意外行为。

答案 2 :(得分:1)

您可能会发现使用File.readlines()从每个文件创建数组更容易,然后在这些数组上运行,而不是直接尝试使用文件数据。这样的事情,也许是:

@blue = []
@red = []

file_1 = File.open('index.txt', 'r')
file_2 = File.open('index2.txt', 'r')

red_vs_blue = file_1.readlines()
lines = file_2.readlines()

red_vs_blue.zip(lines)

red_vs_blue.each do | item, line |
  @blue << line if item == "blue"
  @red << line if item == "red"
end