2

同时迭代两个文件的最简洁的方法是什么,以便如果 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
4

3 回答 3

4

一口气读取整个文件并将其放入变量中从来都不是一个好习惯。

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

@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是内置方法之一。

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

于 2013-10-28T16:01:51.603 回答
3

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

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

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

于 2013-10-28T14:40:03.590 回答
1

File.readlines()您可能会发现使用then 对这些数组进行操作而不是尝试直接处理文件数据更容易从每个文件创建一个数组。像这样的东西,也许:

@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
于 2013-10-28T14:50:22.340 回答