2012-03-08 12 views
12

Estoy usando el archivo de ruby ​​para abrir y leer en un archivo de texto dentro de una tarea de rake . ¿Hay alguna configuración donde pueda especificar que quiero que la primera línea de se salte el archivo? Aquí está mi código hasta ahora:Salteando la primera línea al leer en un archivo en 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 

I intentado line.lineno y también haciendo File.open("users.txt", "r", '\r').each do |line, index| y next if index == 0 pero no he tenido suerte.

Respuesta

21

Cambiar each a each_with_index do |line, index| y next if index == 0 funcionará.

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 

Haciendo uso de un enumerador, que 'recuerda' dónde está.

4

Es probable que realmente desea utilizar csv:

CSV.foreach("users.txt", :headers, :header_converters => :symbol, :col_sep => ',') do |row| 
    User.new(row).save 
end 
4
File.readlines('users.txt')[1..-1].join() 

funciona bien también.

14

función drop(n) eliminará n líneas desde el principio:

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

Se leerá el archivo entero en una matriz y eliminar n primeras líneas. Si está leyendo todo el archivo de todos modos, probablemente sea la solución más elegante.

+0

te refieres a File.readlines ("users.txt"). Drop (1) .each do | line | , su ejemplo da un error – peter

+0

Sí, claro. Debería ser 'File.readlines'. Gracias @peter! – Tombart

+0

¡Esta debería ser la respuesta aceptada! – jpatokal

1

si desea mantener el archivo como IO todo el tiempo (no hay conversiones de matriz) y planea usar los datos en la primera línea:

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

más probable, sin embargo, lo que quiere es manejado por CSV o FasterCSV como otros han señalado. Mi forma favorita para manejar archivos con una línea de cabecera es hacer:

FasterCSV.table('users.txt') 
1

Desde algunas respuestas (? Ya no) el trabajo en Ruby 1.9.3, aquí una muestra de trabajo de los tres mejores métodos

# 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 
Cuestiones relacionadas