Определить последнюю строку в Ruby

#ruby #file-io

#ruby #file-io

Вопрос:

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

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

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

Комментарии:

1. Происходит куча вещей. Мне нужно знать, когда строка, на которой я нахожусь, является последней строкой или последней непустой строкой файла.

Ответ №1:

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

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

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

Ответ №2:

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

 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
  

Ответ №3:

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

 lines = File.open(filename).to_a
  

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

 puts lines.first
  

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

 puts lines.last
  

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

 puts lines.at(5)
  

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

 puts lines.count
  

Комментарии:

1. Это загрузит весь файл в память, поэтому это не очень хороший вариант для больших файлов.

Ответ №4:

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 "1n2n3n"
open("a.txt").lines.with_last.each do |line, is_last|
  p [line, is_last]
end
  

Какие результаты:

 ["1n", false]
["2n", false]
["3n", true]
  

Ответ №5:

Откройте ваш файл и используйте метод 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 обрабатывают поведение при несоответствующих обстоятельствах