如何在Ruby中检测文件结尾?
我编写了以下脚本来读取CSV文件:如何在Ruby中检测文件结尾?,ruby,parsing,csv,eof,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 =
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
有了这一行,我得到了一个例外
我想知道如何在上面的代码中检测文件的结尾。如果不进行测试,您似乎应该执行救援而不是检查
试试这个简短的例子:
f = File.open(__FILE__)
text = f.read
p f.eof? # -> true
p text.class #-> String
使用f.read
可以将整个文件读入文本并达到EOF。
(备注:\uuuu文件\uuuu
是脚本文件本身。您可以使用csv文件)
在代码中使用文本。每行。这将对字符串文本执行每行。它对f
没有影响
您可以使用文件#每行
,而不使用可变文本。无需进行EOF测试<代码>每一行
在每一行上循环并自行检测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
f=File.open(_文件__)
行数=0
f、 每条线都要做|
行数+=1
如果(行数<6)
放入“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
下一个
结束
arr=行分割(“,”)
放置“行号=#{line_num}”
结束
f、 接近
您应该在读取文件后将其关闭。为此使用块更像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
行数=0
文件。打开(_文件_)do | f|
f、 每条线都要做|
行数+=1
如果(行数<6)
放入“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
下一个
结束
arr=行分割(“,”)
放置“行号=#{line_num}”
结束
结束
一个一般性的评论:Ruby中有一个CSV库。通常,最好使用它。谈到这一点
content = File.read("file.txt")
content = File.readlines("file.txt")
上面的“slurps”将整个文件存储到内存中
File.foreach("file.txt") {|line| content << line}
File.foreach(“File.txt”){| line | contentread
和readlines
的问题是,它们将整个文件拖到内存中,只有当您知道该文件将始终放入内存时才是安全的。foreach
始终是安全的,并且运行速度几乎与拖取整个文件的速度相同,因此使用foreach
,除非有强大的技术所有不这样做的原因,例如必须将整个文件放在一个字符串中。每一行
都是IO类方法的IO实例版本foreach
,因此IO.foreach
相当于file.foreach
。是的,@theTinMan确实没有想到要提出这种区别,我认为这是在d中提到的文档化,或者我只是不再有意识地考虑它。我会在答案中添加这一点,这肯定是一个卖点。OP也需要了解,使用IO和文件方法的块形式是惯用的,以避免关闭文件或检查EOF。这只是Ruby使programmi的另一种方式ng更加理智。已完成。:)看起来我在中编辑了它,而您正在对此进行评论。旁注:文件继承自IO;IO,不需要计数器。对EOF执行救援不一定是最好的策略,因为在文件末尾找到EOF
并不是异常行为。应保留例外情况异常的行为,可能不应该发生的行为,或者如果发生了,在正常的事情流程中是不应该发生的。
content = File.read("file.txt")
content = File.readlines("file.txt")
File.foreach("file.txt") {|line| content << line}