Чтение предыдущей строки файла с помощью Ruby - PullRequest
2 голосов
/ 12 сентября 2009

Как прочитать предыдущую строку файла. Противоположность IO.gets.I сначала думал установить IO.lineno на номер строки, которую я хотел прочитать, но это не работает, как ожидалось. Как вы на самом деле читаете предыдущую строку?

Ответы [ 4 ]

4 голосов
/ 12 сентября 2009

Один простой способ - запомнить предыдущую строку, которую вы прочитали:

prev = nil
File.foreach('_vimrc') do |line|
  p [line, prev]  # do whatever processing here
  prev = line
end
3 голосов
/ 12 сентября 2009

Есть несколько способов, это зависит от того, сколько информации вы имеете в своем распоряжении. Если вы знаете длину последней прочитанной строки, вы можете выбрать самый простой подход:

# 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, это фактически не влияет на позицию в файле, а также ухудшает точность переменной для чтения после этой точки.

1 голос
/ 13 сентября 2009

Gem Elif имеет метод get, противоположный IO.gets.

$ sudo gem install elif

$ irb

require "elif"
last_syslog = Elif.open('/var/log/syslog') { |file| file.gets }
0 голосов
/ 12 сентября 2009

Увидел отличное предложение на comp.lang.ruby - используйте IO.tell, чтобы отслеживать положение каждой строки в файле, чтобы вы могли искать прямо к нему:

File.open "foo" do |io|
  idx = [io.tell]
  while l = io.gets
    p l
    idx << io.tell
  end
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...