如何用Ruby将列标题写入csv文件?

iih3973s  于 2022-11-04  发布在  Ruby
关注(0)|答案(4)|浏览(146)

我在用Ruby将列写入csv文件时遇到了麻烦。下面是我的代码片段。

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

这段代码在每一行都添加了列标题,我只需要在每一列数据的顶部添加它。我在这里和其他地方都搜索过了,但没有找到一个明确的答案。如果有任何帮助,我将不胜感激。

cgfeq70w

cgfeq70w1#

我建议使用CSV库:

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

如果您不能使用w选项,而您确实需要a+(例如,数据不能同时全部可用),那么您可以尝试以下技巧:

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

kadbb4592#

最简单的方法是在'w'模式下打开文件一次,写入文件头,然后写入数据。
如果由于某种技术原因不能这样做(例如,数据不能一次全部获得),则可以对文件使用IO#tell方法返回当前文件位置。当打开文件进行追加时,位置被设置为文件的末尾,因此如果当前文件位置为零,则该文件是新创建的,并且没有头文件:

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
bnl4lu3b

bnl4lu3b3#

处理csv文件的最佳方法是使用Ruby的CSV模块。
我有同样的问题后,阅读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
vhipe2zx

vhipe2zx4#

这对我有用

headers = ["Reference Number", "Vendor Line Code"]
CSV.open(file_path, "wb") do |csv|
    csv << headers
    @vendor.vendor_items.each do |vi|
      row_data  = [vi.reference_number, vi.line_code]
      csv << row_data
    end
end

相关问题