2013-04-09 86 views
16

我無法用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 

該代碼將列標題的每一行,我只需要在每個數據列的頂部。我在這裏和其他地方搜索過,但找不到明確的答案。 任何幫助將不勝感激。

回答

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 
+0

嗨,工作。謝謝。 Jfleck – Joe 2013-04-09 19:03:32

38

我會建議使用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 
    } 
} 
2

處理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 
+1

如何在插入一些數據後更改原始標題?說我可能有額外的列,但只有在數據填充後才知道?我試過csv.headers.push,但不會更新它輸出文件中的實際標題。謝謝 – scanales 2016-04-06 19:56:42