#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 обрабатывают поведение при несоответствующих обстоятельствах