2016-04-24 13 views
0

Ich habe eine Reihe von Hashes, die weitgehend die gleichen Werte enthalten; Einige der Hashes haben jedoch zusätzliche Schlüsselwertpaare, die die anderen nicht haben. Zum Beispiel sieht das Array so etwas wieCSV von Array von Hashes mit verschiedenen Schlüsseln erstellen

example_array = [{"make" => "nissan", "model" => "altima"}, {"make" => "nissan", "model" => "maxima", "price" => "20,000"}] 

Mein Problem kommt, dass ich versuche, dieses Array von Hashes in eine CSV-Datei zu exportieren. Ich kann nicht herausfinden, wie man

  1. Vergewissern Sie sich, dass die Header der Datei eine Spalte/Schlüssel für jeden möglichen Schlüssel vorhanden, der

  2. Vergewissern Sie sich im Array besteht, dass die Werte in der am Ende richtige Spalte

Jede Hilfe sehr geschätzt

+0

Was ist mit Standardwerten für den Fall, dass das Attribut fehlt? – Ilya

+0

Ich möchte nur, dass es für diesen Wert/Zelle in diesem Fall leer ist – Splashlin

Antwort

0

würden Sie es schreiben:

require 'csv' 

headers = example_array.inject([]) {|res, h| h.keys | res} #all possible headers 
#=> ["make", "model", "price"] 
rows = example_array.map {|h| h.values_at(*headers)} 
#=> [["nissan", "altima", nil], ["nissan", "maxima", "20,000"]] 
CSV.generate do |csv| 
    csv << headers 
    rows.each do |row| 
    csv << row 
    end 
end 

Wenn Sie csv in Datei schreiben möchten, schreiben Sie einfach CSV.open("myfile.csv", "w") anstelle von CSV.generate.