2010-08-24 19 views
9

Ho bisogno di leggere un file CSV, aggiornare un campo, quindi salvare le modifiche. Ho tutto funzionante, salvo salvare le modifiche al campo che sto aggiornando:Come analizzare un file CSV, aggiornare un campo, quindi salvare

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 

Cosa faccio qui? Come posso salvare le modifiche apportate e aggiornare il file?

risposta

11

Quello che vorrei fare è scrivere i record aggiornati in un nuovo file e poi, se lo si desidera, dopo aver terminato il programma, è possibile eliminare il vecchio file e rinominare il nuovo file per avere il nome del file originale.

Per fare ciò, aprire il file di output nella parte superiore del codice, all'esterno del ciclo each_with_index. per esempio.

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

Poi all'interno del vostro each_with_index ciclo è possibile scrivere la riga corrente per il nuovo file in questo modo:

csv_out << row 

Poi alla fine è possibile chiudere il nuovo file:

csv_out.close 

Come menzionato nei commenti, CSV::Writer non è più nella libreria standard. Una versione equivalente del codice utilizzando il più recente CSV.foreach (per la lettura) e CSV.open (per la scrittura) è:

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

dovrei csv_out.close fuori del ciclo? – thatmiddleway

+0

Sì, il 'csv_out.close' sarebbe al di fuori del ciclo' each_with_index' come si desidera fare una sola volta e dopo aver terminato di eseguire il looping delle righe dal file originale. – mikej

+0

Questo ha senso, grazie! – thatmiddleway

Problemi correlati