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データを出力することができます。