用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