我在使用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
代码将列标题添加到每一行,我只需要在每列数据的顶部。我在这里和其他地方搜索过但无法找到明确的答案。 任何帮助将不胜感激。
答案 0 :(得分:47)
我建议改为使用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
}
}
答案 1 :(得分: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
答案 2 :(得分:3)
处理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