同时迭代两个文件的最佳方法是什么,如果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
答案 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