Vorrei mappare un hash a una linea CSV.Come stampare un hash su una linea CSV
Ho un paio di oggetti in un hash:
person1 = {'first_name' => 'John', 'second_name' => 'Doe', 'favorite_color' => 'blue', 'favorite_band' => 'Backstreet Boys'}
person2 = {'first_name' => 'Susan', 'favorite_color' => 'green', 'second_name' => 'Smith'}
voglio trasformare questo in un file CSV con i tasti come colonne ei valori per ogni riga.
posso facilmente creare le intestazioni creando una CSV::Row
come questo:
h = CSV::Row.new(all_keys_as_array,[],true)
io non posso contare su l'ordine e la più importante, non tutti i valori sono riempiti per tutto il tempo.
Ma quando ora provo ad aggiungere righe alla tabella tramite <<
e array, la mappatura delle intestazioni viene ignorata. Deve essere nel giusto ordine.
A dimostrazione di ciò, ho scritto questo piccolo script:
require 'csv'
person1 = {'first_name' => 'John', 'second_name' => 'Doe', 'favorite_color' => 'blue', 'favorite_band' => 'Backstreet Boys'}
person2 = {'first_name' => 'Susan', 'favorite_color' => 'green', 'second_name' => 'Smith'}
persons = [person1, person2]
all_keys_as_array = %w{first_name second_name favorite_color favorite_band}
h = CSV::Row.new(all_keys_as_array,[],true)
t = CSV::Table.new([h])
persons.each do |p|
r = CSV::Row.new([],[],false)
p.each do |k, v|
r << {k => v}
end
t << r
end
puts t.to_csv
mi aspetterei questo output:
first_name,last_name,favorite_color,favorite_band
John,Doe,blue,Backstreet Boys
Susan,Smith,green,
Invece i valori nell'ordine come appaiono. Così l'output è questo:
first_name,second_name,favorite_color,favorite_band
John,Doe,blue,Backstreet Boys
Susan,green,Smith
La parte più strana è, quando faccio una ricerca tramite ['key']
ottengo i valori corretti:
puts "favorite_bands: #{t['favorite_band']}"
> favorite_bands: [nil, "Backstreet Boys", nil]
Quindi c'è un modo di scrivere in un file CSV come Mi aspetto?
Dove è usato lo script di dimostrazione? Non riesco a farlo funzionare. – jacobmovingfwd
sostituisci "t << r" con la linea menzionata, convertirà la riga in una matrice nell'ordine corretto. Ho appena provato di nuovo e funziona. – leifg