3

ファイル内の各行を反復処理する必要があります。ただし、1 行読んだ後、次の行を先読みして、場合によっては何らかのアクションを実行する必要があります。

コマンドを使用するpeekと、ファイルの 2 行目しか取得できません。ただし、nextコマンドを使用して反復子を移動すると、反復子もインクリメント.eachされます。私が言いたいことを理解するには、以下の 9 行のプログラムを実行し、出力を見てください。7行目をコメントアウトすると、ファイル全体が印刷されますが、peek間違っています。7 行目のコメントを外したままにしておくと、peek は機能しますが、ファイルの半分しか印刷されません。

1 回だけインクリメントする方法が必要か、または を使用せずにファイルを反復処理する方法が必要です.each

これを行う最善の方法は何ですか?

#!/usr/bin/ruby                       
                                   #1  
curFile = File.open("testcase.rb")     #2  
line_enum = curFile.to_enum            #3  
curFile.each do |line|                 #4  
  puts "=> " + line                    #5  
  puts "  peek > " + line_enum.peek    #6  
  line_enum.next                       #7  
end                                    #8  
4

6 に答える 6

1

使用するeach_with_index

curFile = File.readlines("testcase.rb")       

curFile.each_with_index do |line, index|                  
  puts "=> " + line                    
  puts "  peek > " + curFile[index+1]    if index < curFile.count

end   
于 2013-09-20T21:23:19.050 に答える
1

IO と File には列挙可能なものが含まれているため、each_consメソッドを使用できます。

cur_file = File.open("test.csv") do |f| #using a block takes care of closing the file
  f.each_cons(2) do |line1, line2|
    puts "=> #{line1}"
    puts "peek #{line2}" 
  end
end

出力:

=> one
peek two
=> two
peek three
=> three
peek four
于 2013-09-20T20:38:25.900 に答える
0

while代わりにループを使用して#each、カーソルを手動で移動できます。

curFile = File.open("peek.txt")
line_enum = curFile.to_enum
while line_enum
  line = line_enum.next
  puts "=> " + line
  puts "  peek > " + line_enum.peek
end

編集

正確に達成したい内容に応じて、ループ#loopの代わりに使用することもできます。whileこの場合line_enum.peek、ファイルの最後で が呼び出されると、ループから抜け出します。

loop do
  line = line_enum.next
  puts "=> " + line
  puts "  peek > " + line_enum.peek
end
于 2013-09-20T19:44:39.457 に答える
0

問題をひっくり返すとは?前を向いていると考える代わりに、後ろを振り返ってみませんか?

#!/usr/bin/ruby                        #1  
curFile = File.open("testcase.rb")     #2  

prev_line = nil
curFile.each do |line|                 #4  
  if prev_line
    # do something to prev_line based on the content of line  
  end

  prev_line = line # turn the current line into prev_line for the next iteration
end                                    #8 
于 2013-09-20T19:14:16.250 に答える