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

Joe*_*Joe 20 ruby csv fastercsv ruby-on-rails-3

我在使用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
Run Code Online (Sandbox Code Playgroud)

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

knu*_*nut 48

我建议使用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
Run Code Online (Sandbox Code Playgroud)

如果您不能使用该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
  }
}
Run Code Online (Sandbox Code Playgroud)


sfs*_*man 6

最简单的方法是在模式下打开文件一次'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
Run Code Online (Sandbox Code Playgroud)


Asa*_*Ali 5

处理 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
Run Code Online (Sandbox Code Playgroud)

  • 插入一些数据后如何更改原始标题?假设我可能有其他列,但只有在填充数据后才知道?我尝试过 csv.headers.push 但没有更新它输出的文件中的实际标头。谢谢 (2认同)