用Ruby读取前一行文件

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

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

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

有几种方法,这取决于您拥有多少信息。 如果你知道你读到的最后一行的长度,你可以采取最简单的方法

 # 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 ,您应该知道虽然您可以写入File.lineno这样做实际上并不会影响文件中的位置,并且在该点之后也会破坏读取变量的准确性。

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

$ sudo gem install elif

$ irb

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

看到comp.lang.ruby的一个很好的建议 – 使用IO.tell来跟踪文件中每一行的位置,这样你就可以直接找到它:

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