2010-05-12 10 views
9

Estoy usando el código de this tutorial para analizar un archivo CSV y agregar el contenido a una tabla de base de datos. ¿Cómo ignoraría la primera línea del archivo CSV? El código del controlador es el siguiente:Ignorar la primera línea en csv parse Rails

def csv_import 
    @parsed_file=CSV::Reader.parse(params[:dump][:file]) 
    n = 0 
    @parsed_file.each do |row| 
    s = Student.new 
    s.name = row[0] 
    s.cid = row[1] 
    s.year_id = find_year_id_from_year_title(row[2]) 
    if s.save 
     n = n+1 
     GC.start if n%50==0 
    end 
    flash.now[:message] = "CSV Import Successful, #{n} new students added to the database." 
    end 
    redirect_to(students_url) 
end 

Respuesta

11
@parsed_file.each_with_index do |row, i| 
    next if i == 0 
    .... 
+0

Orden n extra compara – baash05

41

Esta pregunta seguía apareciendo cuando yo estaba buscando la manera de saltarse la primera línea con las bibliotecas CSV/FasterCSV, así que aquí está la solución que si al final aquí.

la solución es ... CSV.foreach("path/to/file.csv",{:headers=>:first_row}) do |row|

HTH.

+5

También puede pasar hash '{: headers => true}' como segundo parámetro. Esto funciona también –

3

Si identifica su primera línea como encabezados, obtendrá un objeto en lugar de un simple Array.

Cuando toma los valores de celda, parece que necesita usar .fetch("Row Title") en el objeto .

Esto es lo que se me ocurrió. Me salteo nil con mi if condicional.

CSV.foreach("GitHubUsersToAdd.csv",{:headers=>:first_row}) do |row| username = row.fetch("GitHub Username") if username puts username.inspect end end

0
require 'csv' 
csv_content =<<EOF 
lesson_id,user_id 
5,3 
69,95 
EOF 

parse_1 = CSV.parse csv_content 
parse_1.size # => 3 # it treats all lines as equal data 

parse_2 = CSV.parse csv_content, headers:true 
parse_2.size # => 2 # it ignores the first line as it's header 

parse_1 
# => [["lesson_id", "user_id"], ["5", "3"], ["69", "95"]]  
parse_2 
# => #<CSV::Table mode:col_or_row row_count:3> 

aquí donde está la parte divertida

parse_1.each do |line| 
    puts line.inspect  # the object is array 
end 
# ["lesson_id", "user_id"] 
# ["5", " 3"] 
# ["69", " 95"] 


parse_2.each do |line| 
    puts line.inspect  # the object is `CSV::Row` objects 
end 
# #<CSV::Row "lesson_id":"5" "user_id":" 3"> 
# #<CSV::Row "lesson_id":"69" "user_id":" 95"> 

Así que, por tanto, que puedo hacer

parse_2.each do |line| 
    puts "I'm processing Lesson #{line['lesson_id']} the User #{line['user_id']}" 
end 
# I'm processing Lesson 5 the User 3 
# I'm processing Lesson 69 the User 95 
0
data_rows_only = csv.drop(1) 

lo hará

csv.drop(1).each do |row| 
    # ... 
end 
bucle

voluntad que

0

El uso de este código simple, se puede leer un archivo CSV y pasar por alto la primera línea, que es el encabezado o en el campo nombres:

CSV.foreach(File.join(File.dirname(__FILE__), filepath), headers: true) do |row| 
    puts row.inspect 
end 

Usted puede hacer cualquier cosa que quiera con row. No olvide headers: true

Cuestiones relacionadas