Ответ 1
Измените each
на each_with_index do |line, index|
и next if index == 0
.
Я использую ruby File для открытия и чтения в текстовом файле внутри rake задача. Есть ли параметр, где я могу указать, что я хочу первую строку файл пропущен? Вот мой код:
desc "Import users."
task :import_users => :environment do
File.open("users.txt", "r", '\r').each do |line|
id, name, age, email = line.strip.split(',')
u = User.new(:id => id, :name => name, :age => age, :email => email)
u.save
end
end
Я пробовал line.lineno
, а также делал File.open("users.txt", "r", '\r').each do |line, index|
и next if index == 0
, но не имел никакой удачи.
Измените each
на each_with_index do |line, index|
и next if index == 0
.
Функция drop(n)
удалит строки n
с самого начала:
File.readlines('users.txt').drop(1).each do |line|
puts line
end
Он будет считывать весь файл в массив и удалять первые строки n
. Если вы все равно читаете весь файл, это, вероятно, самое изящное решение.
File.open("users.txt", "r", '\r') do |file|
lines = file.lines # an enumerator
lines.next #skips first line
lines.each do |line|
puts line # do work
end
end
Использование счетчика, который "запоминает", где он находится.
Вероятно, вы действительно хотите использовать csv:
CSV.foreach("users.txt", :headers, :header_converters => :symbol, :col_sep => ',') do |row|
User.new(row).save
end
File.readlines('users.txt')[1..-1].join()
Хорошо работает.
если вы хотите сохранить файл в виде ввода-вывода все время (без преобразования массивов) и планируете использовать данные в первой строке:
f = File.open('users.txt', 'r')
first_line = f.gets
body = f.readlines
Скорее всего, то, что вы хотите, обрабатывается CSV или FasterCSV, как указывали другие. Мой любимый способ обработки файлов с помощью строки заголовка:
FasterCSV.table('users.txt')
Так как в Ruby 1.9.3 работает несколько ответов (не более?), здесь рабочий образец трех лучших методов
# this line must be dropped
puts "using drop"
File.readlines(__FILE__).drop(1).each do |line|
puts line
end
puts ""
puts "using a range"
File.readlines(__FILE__)[1..-1].each do |line|
puts line
end
puts ""
puts "using enumerator"
File.readlines(__FILE__).each do |file, w|
lines = file.lines # an enumerator
lines.next #skips first line
lines.each do |line|
puts line
end
end