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

我在使用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 

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

我建议使用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 } } 

最简单的方法是打开文件一次,在'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 

处理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