¿Cómo escribir el encabezado de las columnas en un archivo csv con Ruby?
ruby-on-rails-3 fastercsv (3)
Tengo problemas para escribir columnas en un archivo csv con Ruby. A continuación se muestra mi fragmento de código.
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
El código agrega los encabezados de columna a cada línea y solo lo necesito en la parte superior de cada columna de datos. He buscado aquí y en otros lugares, pero no puedo encontrar una respuesta clara a cómo se hace. Cualquier ayuda sería muy apreciada.
La forma más limpia de hacerlo es abrir el archivo una vez, en el modo ''w''
, escribir los encabezados y luego escribir los datos.
Si hay alguna razón técnica que no puede hacer esto (por ejemplo, los datos no están disponibles todos a la vez), entonces puede usar el método IO#tell
en el archivo para devolver la posición actual del archivo. Cuando abre el archivo para adjuntarlo, la posición se establece al final del archivo, por lo que si la posición actual del archivo es cero, el archivo se creó recientemente y no tiene encabezados:
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
La mejor manera de manejar el archivo csv es usar el módulo CSV
de Ruby.
Tuve el mismo problema después de leer el código CSV
Encontré esta solución que me parece más eficiente.
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
Recomendaría usar la biblioteca CSV en su lugar:
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
Si no puede usar la opción w
y realmente necesita a+
(p. Ej., Los datos no están disponibles todos a la vez), entonces puede probar el siguiente truco:
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
}
}