2013-04-09 66 views
16

Ho problemi a scrivere colonne in un file csv con Ruby. Di seguito è il mio frammento di codice.Come scrivere l'intestazione delle colonne in un file csv con Ruby?

calc = numerator/denominator.to_f 
data_out = "#{numerator}, #{denominator}, #{calc}" 
File.open('cdhu3_X.csv','a+') do|hdr| 
     hdr << ["numerator","denominator","calculation\n"] #< column header 
      hdr << "#{data_out}\n" 
end 

Il codice aggiunge le intestazioni di colonna a ogni riga e ne ho solo bisogno nella parte superiore di ogni colonna di dati. Ho cercato qui e in altri posti ma non riesco a trovare una risposta chiara a come è stato fatto. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

6

Il modo più semplice per eseguire questa operazione è aprire il file una volta, in modalità 'w', scrivere le intestazioni e quindi scrivere i dati.

Se c'è qualche motivo tecnico che non può farlo (ad esempio, i dati non sono disponibili tutti in una volta), quindi è possibile utilizzare il metodo IO#tell sul file per restituire la posizione corrente del file. Quando si apre il file per aggiungere, la posizione viene impostata alla fine del file, quindi se la posizione del file corrente è pari a zero, quindi il file è stato appena creato e non ha intestazioni:

File.open('cdhu3_X.csv', 'a+') do |hdr| 
    if hdr.tell() == 0 # file is empty, so write header 
    hdr << "numerator, denominator, calculation\n" 
    end 
    hdr << "#{data_out}\n" 
end 
+0

Ciao, quello ha funzionato. Grazie. Jfleck – Joe

38

mi sento di raccomandare a utilizzare il CSV-biblioteca, invece:

require 'csv' 

CSV.open('test.csv','w', 
    :write_headers=> true, 
    :headers => ["numerator","denominator","calculation"] #< column header 
) do|hdr| 
    1.upto(12){|numerator| 
    1.upto(12){ |denominator| 
     data_out = [numerator, denominator, numerator/denominator.to_f] 
     hdr << data_out 
    } 
    } 
end 

Se non è possibile utilizzare l'opzione w e si ha realmente bisogno il a+ (ad esempio, i dati non sono disponibili tutti in una volta), allora si potrebbe provare il seguente trucco :

require 'csv' 

column_header = ["numerator","denominator","calculation"] 
1.upto(12){|numerator| 
    1.upto(12){ |denominator| 
    CSV.open('test.csv','a+', 
     :write_headers=> true, 
     :headers => column_header 
    ) do|hdr| 
      column_header = nil #No header after first insertion 
      data_out = [numerator, denominator, numerator/denominator.to_f] 
      hdr << data_out 
     end 
    } 
} 
2

Il modo migliore per gestire il file csv è utilizzare il modulo CSV di Ruby.

Ho avuto lo stesso problema dopo aver letto il codice CSV Mi sono imbattuto in questa soluzione che trovo più efficiente.

headers = ['col1','col2','col3'] 

CSV.open(file_path, 'a+', {force_quotes: true}) do |csv| 
    csv << headers if csv.count.eql? 0 # csv.count method gives number of lines in file if zero insert headers 
end 
+1

Come cambierei le intestazioni originali dopo aver inserito alcuni dati? Supponiamo che io disponga di colonne aggiuntive, ma lo saprei solo dopo che i dati sono stati compilati? Ho provato csv.headers.push ma non aggiorno le intestazioni attuali nel file che emette. Grazie – scanales

Problemi correlati