How to write columns header to a csv file with Ruby?

Joe picture Joe · Apr 9, 2013 · Viewed 34.2k times · Source

I am having trouble writing columns to a csv file with Ruby. Below is my snippet of code.

 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

The code adds the column headers to every line and I only need it at the top of each column of data. I have searched here and other places but can't find a clear answer to how its done. Any help would be greatly appreciated.

Answer

knut picture knut · Apr 9, 2013

I would recommend to use the CSV-library instead:

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

If you can't use the w option and you really need the a+ (e.g., the data isn't available all at once), then you could try the following trick:

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