ruby ruby-on-rails-3 csv fastercsv

¿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 } }