28

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

このコードはすべての行に列ヘッダーを追加します。データの各列の先頭にのみ必要です。ここや他の場所を検索しましたが、その方法について明確な答えが見つかりません。どんな助けでも大歓迎です。

4

3 に答える 3

57

代わりに 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
  }
}
于 2013-04-09T21:25:58.660 に答える
7

これを行う最もクリーンな方法は、一度ファイルをモード'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
于 2013-04-09T16:18:29.227 に答える
6

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
于 2016-01-12T16:55:39.387 に答える