Ruby1.9でcsvファイルをダウンロード(エンコード問題にも対応)
Ruby1.9系 Rails3でcsvファイルをダウンロードする(エンコード問題にも対応)
下記ソースでひとまず動いている
require 'kconv' require 'csv' columns = Person.all file_name = Kconv.kconv("sample.csv", Kconv::SJIS) header = ["名前1", "名前2", "登録日"] #※1 csv_data = CSV.generate("", {:encoding => 'sjis', :row_sep => "\r\n", :headers => header, :write_headers => true}) do |csv| columns.each do |line| column = [] column << line[:name].encode('UTF-8','Shift_JIS') #※2 column << line[:name].force_encoding('UTF-8') #※3 column << line[:created_at].strftime("%Y年%m月%d日") csv << column end end #※4 csv_data = csv_data.tosjis #※5 send_data(csv_data, :type => 'text/csv; charset=shift_jis; header=present', :filename => file_name)
※1 :encoding ・・・ここで指定してもsjisでファイル生成されなかった。なんで?なので※4で対応
:row_sep ・・・改行コードの指定。上はCR+LFの場合。
:headers ・・・配列でヘッダを指定。
:write_headers ・・・ヘッダの有無を指定。
※2 下記のようなエラーが出た場合
invalid byte sequence in UTF-8
※3 下記のようなエラーが出た場合
http://blog.livedoor.jp/yakisobakintoki/archives/51075070.html
incompatible character encodings: UTF-8 and ASCII-8BIT C:/Ruby193/lib/ruby/1.9.1/csv.rb:1729:in `join' C:/Ruby193/lib/ruby/1.9.1/csv.rb:1729:in `<<'
2と3の違いはよくわからない...
※5これでダウンロード。第一引数のCSVデータがちゃんと渡せれば、後はブラウザの保存時のポップアップが表示される。