Tengo esto a una sola línea.
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"
Haz todo lo anterior y guardar en un archivo CSV, en una línea.
File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}
NOTA:
para convertir una base de datos de registro activo a csv sería algo como esto creo
CSV.open(fn, 'w') do |csv|
csv << Model.column_names
Model.where(query).each do |m|
csv << m.attributes.values
end
end
Hmm @tamouse, que lo esencial es algo confuso para mí sin leyendo la fuente csv, pero genéricamente, suponiendo que cada hash en su matriz tiene el mismo número de pares k/v & que las claves son siempre las mismas, en el mismo orden (es decir, si sus datos están estructurados), esto debería hacer la escritura:
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
Si los datos no está estructurado esto, obviamente, no va a funcionar
La respuesta tiene es genial, pero déjame instarte a no usar CSV. Si no tiene pestañas en sus datos, es mucho más fácil lidiar con los archivos delimitados por tabuladores, ya que no implican tanta cita y escapatoria, etc. Si debe usar CSV, por supuesto, son los descansos. –
@Bill, el módulo CSV maneja perfectamente los archivos delimitados por tabuladores, así como los archivos csv reales. La opción: col_sep le permite especificar el separador de columna como "\ t" y todo está bien. – tamouse
aquí hay más información sobre CSV http://docs.ruby-lang.org/es/2.1.0/CSV.html –