CSV.generateを使って、配列の中身をCSV形式でダウンロードする

CSV.generateとは?

対象データを自動的にCSV形式に変換してくれるCSVライブラリの一種です。

テストデータの作成

今回は辞書のような配列を用意し、csvファイル作成します。

dictionary = [['', 'dog'], ['', 'cat'], ['', 'pig'], ['', 'monkey']]

CSV.generateを使って、配列をCSV形式に変換

csv = CSV.generate(force_quotes: true) { |generate_data|
  dictionary.each do |data|
    set_data = [data[0], data[1]]
    generate_data << set_data
  end
}
send_data csv, type: :csv, filename: "dictionary.csv"

変数(generate_data)に格納したデータ(set_data)は自動的にcsv形式に変換され、
force_quotes: trueとすることで対象のデータを"“で囲うことができます。
実際のダウンロード処理はsend_dataを使い、指定したデータをダウンロードさせ、
file_nameには自由にファイル名を指定することができます。

ここまでの処理が成功すると、このようにcsvファイルが出来上がります。 f:id:maru877:20170703223258p:plain

補足 文字コード変換について

CSV.generateはencodingオプションを与えることで、ファイルの書式を文字コードを変換することができます。

# Encoding::SJISはShift_JISを表しています
CSV.generate(force_quotes: true, encoding:Encoding::SJIS) 
# Encoding::CP65001はutf-8を表しています
CSV.generate(force_quotes: true, encoding:Encoding::CP65001) 

それぞれの文字コードエイリアスは以下のコマンド取得できます。
$ Encoding.aliases.each {|e|p e}
f:id:maru877:20170703224659p:plain