4

CSV ファイルを読み取るために、次のスクリプトを作成しました。

f = File.open("aFile.csv")
text = f.read
text.each_line do |line|
  if (f.eof?)
    puts "End of file reached"
  else
    line_num +=1
    if(line_num < 6) then
      puts "____SKIPPED LINE____"
      next
    end
  end

  arr = line.split(",")
  puts "line number  = #{line_num}" 
end

次の行を削除すると、このコードは正常に実行されます。

 if (f.eof?)
     puts "End of file reached"

この行を使用すると、例外が発生します。

上記のコードでファイルの終わりを検出する方法を知りたいと思っていました。

4

3 に答える 3

3

https://www.ruby-forum.com/topic/218093#946117でこれについて話しています。

content = File.read("file.txt")
content = File.readlines("file.txt")

上記は、ファイル全体をメモリに「丸呑み」します。

File.foreach("file.txt") {|line| content << line}

も使用できますIO#each_line。これらの最後の 2 つのオプションは、ファイル全体をメモリに読み込みません。ブロックを使用すると、IO オブジェクトも自動的に閉じられます。他にも方法があります。IO および File クラスは非常に機能が豊富です。

File は IO のサブクラスであるため、IO オブジェクトを参照します。オブジェクトの File クラスから追加されたメソッドが本当に必要ない場合は、IO を使用する傾向があります。

この方法では、EOF を処理する必要はありません。Ruby が処理します。

本当に必要がない場合は、そうしないことが最善の方法である場合があります。

もちろん、Ruby にはそのためのメソッドがあります。

于 2013-07-13T21:30:26.730 に答える
1

これをテストせずに、チェックではなくレスキューを実行する必要があるようです。

http://www.ruby-doc.org/core-2.0/EOFError.html

file = File.open("aFile.csv")

begin
  loop do
    some_line = file.readline
    # some stuff
  end
rescue EOFError
  # You've reached the end. Handle it.
end
于 2013-07-13T21:15:43.993 に答える