file.lines.drop(500).take(100) # will get you lines 501-600
Как правило, вы не можете избежать чтения файла с самого начала до интересующей вас строки, поскольку каждая строка может иметь разную длину.Единственное, чего вы можете избежать, это загрузить весь файл в большой массив.Просто читайте построчно, считая и отбрасывая их, пока не достигнете того, что ищете.Очень похоже на ваш собственный пример.Вы можете просто сделать его более рубиновым.
PS.комментарий Жестянщика заставил меня поэкспериментировать.Хотя я не нашел причины, по которой drop
загружал бы весь файл, проблема действительно есть: drop
возвращает остальную часть файла в массиве.Вот как этого можно избежать:
file.lines.select.with_index{|l,i| (501..600) === i}
PS2: Код выше, хотя и не создает огромный массив, выполняет итерацию по всему файлу, даже по строкам ниже 600. :( Вот третья версия:
enum = file.lines
500.times{enum.next} # skip 500
enum.take(100) # take the next 100
или, если вы предпочитаете FP:
file.lines.tap{|enum| 500.times{enum.next}}.take(100)
В любом случае, хороший смысл этого монолога заключается в том, что вы можете научиться нескольким способам итерации файла.;)