2010-08-24 11 views
9

Necesito leer un archivo CSV, actualizar un campo y guardar los cambios. Tengo todo funcionando bien salvo guardar mis cambios en el campo Estoy actualizando:Cómo analizar un archivo CSV, actualizar un campo y luego guardar

require 'csv' 
@parsed_file = CSV::Reader.parse(File.open("#{RAILS_ROOT}/doc/some.csv")) 
@parsed_file.each_with_index do |row, x| 
    address = row[5] 
    l = Location.address_find(address) 
    if l != nil 
    puts "#{l.name} at #{l.address}" 
    row[14] = l.store_code 
    puts row[14] 
    else 
    puts "No matching address Found!!!" 
    end 
    #What do I do here? Something like this? CSV::Writer.generate(@parsed_file) 
end 

¿Qué hago aquí? ¿Cómo guardo los cambios que realicé y actualicé el archivo?

Respuesta

11

Lo que haría sería escribir los registros actualizados en un nuevo archivo y luego, si lo desea, una vez que haya terminado su programa puede eliminar el archivo anterior y renombrar el nuevo para tener el nombre original.

Para hacer esto, abriría el archivo de salida en la parte superior de su código, fuera del bucle each_with_index. p.ej.

csv_out = CSV::Writer.generate(File.open('new.csv', 'wb')) 

A continuación, dentro de su bucle de each_with_index se puede escribir la fila actual en el nuevo archivo de esta manera:

csv_out << row 

Luego, al final se puede cerrar el nuevo archivo:

csv_out.close 

Como se menciona en los comentarios, CSV::Writer ya no se encuentra en la biblioteca estándar. Una versión equivalente del código utilizando el nuevo CSV.foreach (para lectura) y CSV.open (por escrito) es:

CSV.open("path/to/file.csv", "wb") do |csv_out| 
    CSV.foreach("#{RAILS_ROOT}/doc/some.csv") do |row| 
    address = row[5] 
    l = Location.address_find(address) 
    if l != nil 
     puts "#{l.name} at #{l.address}" 
     row[14] = l.store_code 
     puts row[14] 
    else 
     puts "No matching address Found!!!" 
    end 
    csv_out << row 
    end 
end 
+0

habría que csv_out.close fuera del bucle? – thatmiddleway

+0

Sí, el 'csv_out.close' estaría fuera del ciclo' each_with_index' ya que solo quiere hacer esto una vez y después de haber terminado de pasar las filas del archivo original. – mikej

+0

Eso tiene sentido, ¡Gracias! – thatmiddleway

Cuestiones relacionadas