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
コードはすべての行に列ヘッダーを追加し、データの各列の上部にのみ必要です。私はここや他の場所を検索しましたが、どのように行われたかについて明確な答えを見つけることができません。どんな助けでも大歓迎です。
代わりに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
}
}
これを行う最もクリーンな方法は、'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
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