如何检测Ruby中的文件结尾?

时间:2013-07-13 21:02:40

标签: ruby parsing csv eof

我编写了以下脚本来读取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"

有了这一行,我得到了一个例外。

我想知道如何检测上面代码中的文件结尾。

3 个答案:

答案 0 :(得分:5)

试试这个简短的例子:

f = File.open(__FILE__)
text = f.read
p f.eof?      # -> true
p text.class #-> String

使用f.read,您将整个文件读入文本并达到EOF。 (备注:__FILE__是脚本文件本身。您可以使用csv-file)。

在您的代码中,您使用text.each_line。这将对字符串文本执行each_line。它对f没有影响。

您可以在不使用变量文本的情况下使用File#each_line。 EOF的测试不是必需的。每行each_line循环,并自行检测EOF。

f = File.open(__FILE__)
line_num = 0
f.each_line do |line|
  line_num +=1
  if (line_num < 6) 
     puts "____SKIPPED LINE____"
     next
  end

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

您应该在阅读后关闭该文件。为此使用块更像Ruby:

line_num = 0
File.open(__FILE__) do | f|
  f.each_line do |line|
    line_num +=1
    if (line_num < 6) 
       puts "____SKIPPED LINE____"
       next
  end

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

一般说法:Ruby中有一个CSV库。通常最好使用它。

答案 1 :(得分: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。最后两个选项不会将整个文件读入内存。使用该块也会自动关闭IO对象。还有其他方法,IO和File类功能非常丰富!

我指的是IO对象,因为File是IO的子类。当我不需要File对象中添加的对象方法时,我倾向于使用IO。

通过这种方式你不需要处理EOF,Ruby会为你服务。

有时最好的处理不是,当你真的不需要时。

当然,Ruby有a method

答案 2 :(得分: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