2013-04-09 19 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

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

関連する問題