查找文件中最后一行的开头?

时间:2013-08-02 09:37:08

标签: ruby file

由于某些原因,我必须找到文件中最后一行的开头,到目前为止我已经这样做了:

file.seek(-1,IO::SEEK_END)
while file.getc != "\n"
  file.seek(-2,IO::SEEK_CUR)
end

这是另一种方式,但速度要慢得多:

buff = file.readlines
file.seek(-(buff.pop).length,IO::SEEK_END)

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用

找到文件中所有行的末尾位置
offsets = f.each.map { f.tell }

显然,最后一行的开头是倒数第二行的结尾,即offsets[-2]

所以为了加快速度,你需要做的就是首先到seek远离你绑定的末尾已超过最后一行的开头,然后以相同的方式获得一个列表。

假设您的所有保证行的长度少于80个字符:

open('myfile') do |f|
  f.seek(-80, IO::SEEK_END)
  offsets = f.each.map { f.tell }
  puts offsets[-2]
end

或者,如果您对文件中的行长度知之甚少,则可以进行迭代,直到您发现已捕获两个或多个行结尾。此代码一步一步地从文件末尾开始回溯80个字符,直到offsets有两个或更多条目。

open('myfile') do |f|
  start = 0
  offsets = []
  loop do
    start -= 80
    f.seek(start, IO::SEEK_END)
    offsets = f.each.map { f.tell }
    break if offsets.size >= 2
  end
  puts offsets[-2]
end

请注意,有一些特殊的边界情况:

    如果您尝试寻找文件的开头,
  • IO会引发错误

  • 如果您的文件只有一行,那么您想要的值为零,但此算法永远不会找到它