もふもふ技術部

CakePHPでテーブルの情報をCSVに吐いたり読んだりしてみる


概要

CsvExportBehaviorとCsvImportBehaviorを使ってCSVの情報をテーブルに入れたり吐いたりしてみる。

PHP5.4、CakePHP2.2.5を利用。

テーブルの情報をCSVファイルで出力する

DBの情報を出力する時はCsvExportBehaviorという子を落としてきて使えば楽そう。

下記のURLから落としてきて、app/Model/Behaviorの下に入れる。MITライセンス。

https://github.com/pronique/CakePHP-ProUtils-Plugin/blob/master/Model/Behavior/CsvExportBehavior.php

ModelのactAsにCsvExportを追加する。

あとは下記のようなexport用の関数をControllerに配置すれば良いらしい。

これでControllerのexportが呼ばれるとDBの情報がCSVで出力されるようになる、と思ったらカンマ区切りではなくセミコロン区切りで表示された。CSVExportBehavior.phpを見ると、たしかにデフォルトはそう設定されている。actsAsで指定できるけど面倒だからコードの当該部分を直す。

これでカンマ区切りになった。

出力するカラムを指定したり、ヘッダ行の名前を編集したりといった器用なことはできないっぽいけど、そのへんはCsvExportBehavior.phpのexportCSV関数を自前で編集してやればいいか。

処理的には、一時ファイルに出力しておいてそれをダウンロードさせるような流れになっている。Modelに対してfind(‘all’)してるけど、これってデータ量が大きかった場合メモリの使用量はどんな感じになるんだっけか。まぁ、問題が出たらここもうまく書き換えればいいか。

CSVファイルの内容をインポートする

インポートする場合はCsvImpotBehaviorを使えば良いっぽい。

https://github.com/CakeDC/utils/blob/master/Model/Behavior/CsvImportBehavior.php

エクスポートの時と同じく、app/Model/Behaviorの下にこれを置く。

次にModelのactAsに記述。

Controllerにimport用の関数を加えます。面倒なので今回はファイル名ベタ打ち。

上のコードで指定したhoge.csvが読めるように、さっきエクスポートのところで出力したhoge.csvをapp/webrootの下に置きます。

この状態で動かしてみたら、何やらエラーが起きてうまく動かなかった。下記のようなデータが入ってしまい、validationに書いてた必須チェックで落ちているらしい。

特に空白行が入っているわけでもないのだけど、改行コードのせいだろうか。まぁ、面倒なので下記のようにwhileで回しているところにサイズチェック追加。

間違った直し方な気はするけど、まぁ、いいや。

The following two tabs change content below.
masato watanabe

masato watanabe

もふもふ部ブレーン。プログラマ兼ライター。