Rectangle 27 0

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


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

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:

Note
Rectangle 27 0

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


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

If there's some technical reason that can't do this (e.g., the data isn't available all at once), then you can use the IO#tell method on the file to return the current file position. When you open the file for appending, the position is set to the end of the file, so if the current file position is zero, then the file was newly created and has no headers:

The cleanest way to do this is to open the file once, in mode 'w', write the headers, and then write the data.

Note
Rectangle 27 0

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


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

If there's some technical reason that can't do this (e.g., the data isn't available all at once), then you can use the IO#tell method on the file to return the current file position. When you open the file for appending, the position is set to the end of the file, so if the current file position is zero, then the file was newly created and has no headers:

The cleanest way to do this is to open the file once, in mode 'w', write the headers, and then write the data.

Note
Rectangle 27 0

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


CSV
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

How would I change the original headers after inserting some data? Say I may have additional columns but only would know after the data has been populated? I've tried csv.headers.push but doesn't update the actual headers in the file it outputs. Thanks

I had same problem after reading CSV code I came across this solution which i find most efficient.

Note