Определить последнюю строку в Ruby - PullRequest
2 голосов
/ 25 октября 2011

Мне интересно, как я могу определить, когда я нахожусь в последней строке файла, в котором я читаю. Мой код выглядит как

File.open(file_name).each do |line|
    if(someway_to_determine_last_line)
end

Я заметил, что есть файл .eof? метод, но как бы я вызвал метод во время чтения файла? Спасибо!

Ответы [ 5 ]

6 голосов
/ 25 октября 2011

Если вы перебираете файл с each, то последняя строка будет передана в блок , после достигнут конец файла, потому что последняя строка по определениюстрока, заканчивающаяся EOF.

Так что просто позвоните file.eof? в блоке.

Если вы хотите определить, является ли это последняя непустая строка вфайл, вам придется реализовать какую-то подсказку.

3 голосов
/ 25 октября 2011

В зависимости от того, что вам нужно сделать с этой «последней непустой строкой», вы можете сделать что-то вроде этого:

last_line = nil
File.open(file_name).each do |line|
    last_line = line if(!line.chomp.empty?)
    # Do all sorts of other things
end
if(last_line)
    # Do things with the last non-empty line.
end
1 голос
/ 18 августа 2017

Секретный соус - .to_a

lines = File.open(filename).to_a

Получить первую строку:

puts lines.first

Получить последнюю строку:

puts lines.last

Получить n строка файла:

puts lines.at(5)

Получить количество строк:

puts lines.count
1 голос
/ 25 октября 2011

fd.eof? работает, но просто для удовольствия, вот общее решение, которое работает с любым типом перечислителей (Ruby 1.9):

class Enumerator
  def +(other)
    Enumerator.new do |yielder|
      each { |e| yielder << e }
      other.each { |e| yielder << e }
    end
  end

  def with_last
    Enumerator.new do |yielder|
      (self + [:some_flag_here]).each_cons(2) do |a, b|
        yielder << [a, b == :some_flag_here]
      end
    end
  end
end

# a.txt is a file containing "1\n2\n3\n"
open("a.txt").lines.with_last.each do |line, is_last|
  p [line, is_last]
end

Какие выходы:

["1\n", false]
["2\n", false]
["3\n", true]
0 голосов
/ 30 декабря 2012

Откройте ваш файл и используйте метод readline:

Чтобы просто манипулировать последней строкой файла, сделайте следующее:

f = File.open('example.txt').readlines
f.each do |readline|
  if readline[f.last]
    puts "LAST LINE, do something to it"
  else
    puts "#{readline} "
  end
end

Строка 1 читает файл в виде массива строк

Строка 2 использует этот объект и перебирает каждый из них

Строка 3 проверяет, соответствует ли текущая строка последней строке

Строка 4 действует, если это совпадение

Поведение строк 5 и 6 для несоответствующих обстоятельств

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...