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

前端 未结 3 669
Happy的楠姐
Happy的楠姐 2020-12-14 07:33

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}, #{de         


        
相关标签:
3条回答
  • 2020-12-14 08:00

    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
      }
    }
    
    0 讨论(0)
  • 2020-12-14 08:05

    Best way to handle csv file is to use Ruby's CSV module.

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

    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
    
    0 讨论(0)
  • 2020-12-14 08:15

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

    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:

    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
    
    0 讨论(0)
提交回复
热议问题