2012-03-08 3 views
12

Я использую файл ruby ​​для открытия и чтения в текстовом файле внутри рейка . Есть ли параметр, где я могу указать, что я хочу, чтобы первая строка пропустила файл? Вот мой код до сих пор:Пропуск первой строки при чтении в файле в 1.9.3

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, но не везло.

ответ

21

Изменение each до each_with_index do |line, index| и next if index == 0 будет работать.

9
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 
14

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

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

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

+0

Вы имеете в виду File.readlines ("users.txt"). Drop (1) .each do | line | , ваш пример дает ошибку – peter

+0

Да, конечно. Это должно быть 'File.readlines'. Спасибо @peter! – Tombart

+0

Это должен быть принятый ответ! – jpatokal

1

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

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

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

FasterCSV.table('users.txt') 
1

С несколько ответов (?) Больше не работать в Руби 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 
Смежные вопросы