Codeigniter:クエリからCSVダウンロードした時のCSVデータを変更

CodeigniterでクエリからCSVダウンロードを行った際に、データベースユーティリティクラスの「csv_from_result」を使用してCSVデータを取得しました。
「csv_from_result」で取得したデータを参照すると行の末尾にカンマが入ってしまいます。また、最終行に改行が入ってしまいます。
「行の末尾のカンマ」や「最終行に改行」を入れたくなかったので、「csv_from_result」を変更してCSVデータを取得しました。
その時に行った処理をメモします。


csv_from_result

データベースユーティリティクラスの「csv_from_result」は下記のファイルに記載されています。

system/database/DB_utility.php

クエリの結果からCSVを生成します。

    /**
     * Generate CSV from a query result object
     *
     * @access    public
     * @param    object    The query result object
     * @param    string    The delimiter - comma by default
     * @param    string    The newline character - \n by default
     * @param    string    The enclosure - double quote by default
     * @return    string
     */
    function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
    {
        if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
        {
            show_error('You must submit a valid result object');
        }

        $out = '';

        // First generate the headings from the table column names
        foreach ($query->list_fields() as $name)
        {
            $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
        }

        $out = rtrim($out);
        $out .= $newline;

        // Next blast through the result array and build out the rows
        foreach ($query->result_array() as $row)
        {
            foreach ($row as $item)
            {
                $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
            }
            $out = rtrim($out);
            $out .= $newline;
        }

        return $out;
    }

■ 変更内容

新しくhelperを作成します。
今回は「csvdata_helper.php」というヘルパーを作成、「csv_from_result」のソースをコピーし、下記のように変更しました。
行の末尾のカンマと最終行の改行を削除するように変更してます。

・ヘルパー(csvdata_helper.php)

if ( ! function_exists('csv_from_result'))
{
    function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
    {
        if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
        {
            show_error('You must submit a valid result object');
        }

        $out = '';

        // First generate the headings from the table column names
        foreach ($query->list_fields() as $name)
        {
            $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
        }

        $out = rtrim($out);
        // 行の末尾のカンマを削除
        $out = rtrim($out, $delim);
        $out .= $newline;

        // Next blast through the result array and build out the rows
        foreach ($query->result_array() as $row)
        {
            foreach ($row as $item)
            {
                $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
            }
            $out = rtrim($out);
            // 行の末尾のカンマを削除
            $out = rtrim($out, $delim);
            $out .= $newline;
        }

        // 最終行に改行を削除
        $out = rtrim($out, $newline);
        return $out;
    }
}

コントローラー側でCSVデータを取得する際に新しく作成したヘルパーの「csv_from_result」を呼び出し、CSVデータを取得します。

・コントローラー

    // 作成したヘルパーを読み込む
    $this->load->helper(array('download', 'csvdata'));

    // クエリデータ取得
    $query = $this->db->query('SQL文');

    // ヘルパーに追加した関数を呼び出し、CSVデータ取得
    $data = csv_from_result($query);

    force_download('hoge.csv', $data);

上記方法で「行の末尾のカンマ」や「最終行に改行」が入らないようにCSVデータを出力することができます。