用Ruby读取前一行文件

时间:2009-09-12 14:23:16

标签: ruby io

如何阅读文件的主要行。与IO.gets.I相反,我最初认为将IO.lineno设置为我想要读取的行号,但这并不像预期的那样工作。你如何阅读上一行?

4 个答案:

答案 0 :(得分:4)

一种简单的方法是记住你读过的上一行:

prev = nil
File.foreach('_vimrc') do |line|
  p [line, prev]  # do whatever processing here
  prev = line
end

答案 1 :(得分:3)

有两种方法,取决于您掌握的信息量。 如果你知道你读到的最后一行的长度,你可以采取最简单的方法

# assume f is the File object
len = last_line_length
f.seek -len, IO::SEEK_CUR

当然,如果没有提供信息,那么事情就会变得不那么好了。您可以使用与上面相同的方法向后移动(一次一个字节),直到您按下换行标记或从lineno开始并从头开始读取。像

这样的东西
lines = f.lineno
f.rewind
(lines - 1).times { f.gets }

但是,据我所知,go back 1 N只有N代表一条线,没有直接机制。

顺便说一句,您应该知道虽然您可以写File.lineno这样做但实际上不会影响文件中的位置,并且在该点之后也会破坏读取变量的准确性。

答案 2 :(得分:1)

Elif gem有一个与IO.gets相反的gets方法。

  

$ sudo gem install elif

     

$ irb

require "elif"
last_syslog = Elif.open('/var/log/syslog') { |file| file.gets }

答案 3 :(得分:0)

comp.lang.ruby上看到了一个很好的建议 - 使用IO.tell来跟踪文件中每一行的位置,以便您可以直接查找它:

File.open "foo" do |io|
  idx = [io.tell]
  while l = io.gets
    p l
    idx << io.tell
  end
end