Ho questo verso il basso per una sola riga.
rows = [['a1', 'a2', 'a3'],['b1', 'b2', 'b3', 'b4'], ['c1', 'c2', 'c3'], ... ]
csv_str = rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join("")
#=> "a1,a2,a3\nb1,b2,b3\nc1,c2,c3\n"
fare tutto quanto sopra e Salva come csv, in una sola riga.
File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}
NOTA:
per convertire un database di record attivo in formato CSV sarebbe qualcosa come questo penso
CSV.open(fn, 'w') do |csv|
csv << Model.column_names
Model.where(query).each do |m|
csv << m.attributes.values
end
end
Hmm @tamouse, che succo è motivo di confusione per me senza leggendo il sorgente csv, ma genericamente, supponendo che ogni hash nell'array abbia lo stesso numero di coppie k/v & che le chiavi siano sempre le stesse, nello stesso ordine (cioè se i tuoi dati sono strutturati), questo dovrebbe fare il rogito:
rowid = 0
CSV.open(fn, 'w') do |csv|
hsh_ary.each do |hsh|
rowid += 1
if rowid == 1
csv << hsh.keys# adding header row (column labels)
else
csv << hsh.values
end# of if/else inside hsh
end# of hsh's (rows)
end# of csv open
Se i dati non è strutturato questo ovviamente non funzionerà
La risposta si ha è grandioso, ma lascia che ti chieda di non usare CSV. Se non si dispone di schede nei dati, i file delimitati da tabulazioni sono molto più facili da gestire in quanto non comportano così tanto citazioni, fughe e simili. Se devi usare CSV, ovviamente, sono le interruzioni. –
@Bill, il modulo CSV gestisce in modo ordinato i file delimitati da tabulazioni e i file csv effettivi. L'opzione: col_sep consente di specificare il separatore di colonne come "\ t" e tutto va bene. – tamouse
qui c'è più informazioni su CSV http://docs.ruby-lang.org/en/2.1.0/CSV.html –