その他
    ホーム 技術発信 DoRuby ruby on railsでデータをCSV形式で出力する。 to_csv Plugin編

    ruby on railsでデータをCSV形式で出力する。 to_csv Plugin編

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    こんにちは、KBMJの中平@railsエンジニアです。

    今回は、ruby on railsでデータをCSVファイル出力が簡単にできる プラグインついて書きます。

    前回、ruby on railsでデータをExcelファイルに出力する方法を書きましたが

    ExcelファイルよりCSVファイルに出力する機会が多いだろうと思います。

    また、railsでCSVファイルを出力するのは、さまざまな方法がありますが、

    今回は設定も簡単で、コードの記述も比較的少なくてすむ to_csvというpluginの使い方について書こうと思います。

    環境

    OS : Windows Vista
    Ruby : 1.8.6
    ruby on rails : 2.1 (2系以上ならto_csvが使えると思います)

    to_csvのインストール

    ruby script/plugin install git://github.com/arydjmal/to_csv.git

    fastercsvのインストール

    to_csv はfastercsvが必要なため
    gem install fastercsv

    コントローラーのメソッドに以下のコードを記述

    def index
        @users = User.all

        respond_to do |format|
                format.html
                format.xml { render :xml => @users }
                format.csv { send_data @users.to_csv }
        end
    end

    @users.to_csv で取得したデータをCSV形式にしています。
    また README.rdocに書いているオプションを解説すると

     @users.to_csv  
     すべてのカラムを出力

     @users.to_csv(:only => [:last_name, :role]) 
     onlyで指定したカラムを出力 

      @users.to_csv(:headers => false) 
     先頭行にカラム名を出力しない

      @users.to_csv(:except => [:last_name, :role]) 
     exceptで指定したカラム以外を出力

      @users.to_csv(:except => :role, :methods => :admin?) 
     :methodsはカラム名?で記述したカラムのデータのnullを判定しているぽい

     nullだったらfalse null以外はtrueを表示している

    このような動作をするようです。
    このあたりは、find時に出力データをrails側で制御してもいいかもしれません。

    実際にruby on railsでデータをCSVに出力する


    コントローラー名/index/hoge.csv

    というようにアクション名の後ろにファイル名をつけてブラウザでアクセスすると
    データがCSV形式で出力されますので、ファイルに保存後エディタ等で開くとデータを見ることができます。

    なお、この出力したファイルをExcelで表示してみるとわかるのですが、
    なんと日本語が文字化けします。これはto_csvの出力がUTF8になっているためで、Excelはsjisでないと日本語が文字化けしてしまいます。

    原因は出力時の文字コードですので、kconvなどを利用して、CSVデータを出力している部分に tosjis をしてあげればいいでしょう。

    この to_csvというplugin は簡単に導入できてコードも数行で済みますので、ruby on rails から CSV形式でデータ出力 を簡単にしたい場合には試してみてはいかがでしょうか?

    Ary Djmal / to_csv plugin: Better Excel Compatibility
     http://arydjmal.com/2008/6/11/to_csv-plugin-better-excel-compatibility

    arydjmal’s to_csv at master – GitHub
     http://github.com/arydjmal/to_csv