我编写了以下脚本来读取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"
有了这一行,我得到了一个例外。
我想知道如何检测上面代码中的文件结尾。
答案 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