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