Подтвердить что ты не робот

Пропуск первой строки при чтении в файле в 1.9.3

Я использую 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, но не имел никакой удачи.

4b9b3361

Ответ 1

Измените each на each_with_index do |line, index| и next if index == 0.

Ответ 2

Функция drop(n) удалит строки n с самого начала:

File.readlines('users.txt').drop(1).each do |line| 
  puts line
end 

Он будет считывать весь файл в массив и удалять первые строки n. Если вы все равно читаете весь файл, это, вероятно, самое изящное решение.

Ответ 3

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

Использование счетчика, который "запоминает", где он находится.

Ответ 4

Вероятно, вы действительно хотите использовать csv:

CSV.foreach("users.txt", :headers, :header_converters => :symbol, :col_sep => ',') do |row|
  User.new(row).save
end 

Ответ 5

File.readlines('users.txt')[1..-1].join()

Хорошо работает.

Ответ 6

если вы хотите сохранить файл в виде ввода-вывода все время (без преобразования массивов) и планируете использовать данные в первой строке:

f = File.open('users.txt', 'r')
first_line = f.gets
body = f.readlines

Скорее всего, то, что вы хотите, обрабатывается CSV или FasterCSV, как указывали другие. Мой любимый способ обработки файлов с помощью строки заголовка:

FasterCSV.table('users.txt')

Ответ 7

Так как в 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