Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中检测文件结尾?_Ruby_Parsing_Csv_Eof - Fatal编程技术网

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

如何在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 =

我编写了以下脚本来读取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
有了这一行,我得到了一个例外


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

如果不进行测试,您似乎应该执行救援而不是检查


试试这个简短的例子:

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 | content
read
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}