DEVELOPERS BLOGデベロッパーズブログ
- HOME >
- 加藤 正人のデベロッパーズブログ >
- CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法・その2
加藤 正人のデベロッパーズブログ
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
ソースコード
前回の仕様で作成したビヘイビアのコードは下記のようになる。行数が多いので、スクロールバーを使って閲覧するか、SyntaxHighlignter のコピペ機能を利用してテキストエディタ等に張り付けて参照されたい。
メソッド解説
このビヘイビアでは、すべての処理は setup() パブリックメソッドで行われる。
パブリックメソッド
- public function setup(Model $model, $settings=array())
-
このメソッドでは以下の動作を行う。
- ビヘイビアの宣言時パラメータを既定値に上書きして、実際に適用されるパラメータの組を生成する。
- パラメータに問題がない場合、指定された CSV ファイルをオープンし、スキーマを生成する。
- その後、CSV ファイルをロードするテーブルが存在していれば一旦削除し、改めて2. で生成したスキーマに従いテーブルを生成する。
- CSV ファイルからレコードを読み込み、スキーマに従ってテーブルにデータを書き込む。
- すべてのデータを書き込んだら CSV ファイルをクローズして終了。
$settings に連想配列として与えるパラメータには、下記のものが利用可能。
- csv_file
-
読み込む CSV ファイルへのパスまたは URL。必須。
- schema
-
スキーマの取得方法を指定する。既定値は FALSE。配列を与えた場合、その配列を CakePHP のスキーマ形式として使用する。(実際に使用するのはフィールド名と type 情報のみ。)
文字列 'firstline' が与えられた場合は、CSV ファイルの1行目をフィールド名情報として解釈しスキーマを生成する。各フィールドは STRING 型とみなす。
それ以外の場合はフィールド名を 'Field0', 'Field1', ... とし、値は STRING 型とみなしてスキーマを生成する。
- skiplines
-
CSV処理をする前にファイルから読み飛ばす行数。既定値は0。
ここで指定された行数を読み飛ばした後からフィールド名行または CSV レコード行処理が始まる。
- encoding
-
読み込む CSV ファイルの文字エンコーディングを指定する。既定値は 'auto' (自動認識)。
- delimiter
-
CSV ファイルのフィールド区切り文字を指定する。既定値は ',' (ASCII カンマ)。
- enclosure
-
CSV ファイルのフィールドが囲み記号で囲まれている場合の記号を指定する。既定値は '"' (ASCII ダブルクォート)。
- escape
-
CSV ファイルのフィールド内で特殊文字をエスケープする場合に使用する文字を指定する。既定値は '\' (ASCII バックスラッシュ)。
- maxrecords
- CSV ファイルをテーブルに書き出す際に、1度の INSERT 文で出力する CSV レコード数の上限を指定する。既定値は 100。
プライベートメソッド
setup() パブリックメソッド内では、以下のプライベートメソッドで個別の処理を行う。
- private function _init_setting(Model $model, $settings)
-
ビヘイビア宣言時のオプションパラメータを取得し、既定値に上書きして実際に適用するオプションを決定する。
また、接続設定がロードされていない場合は、ConnectionManager 経由で接続設定を取得しておく。
- private function _open_csv($csv_file)
-
物理ファイルのパスまたはネット上の URL で指定された CSV ファイルをオープンしファイルポインタを返す。
- private function _convert($schema, $data)
-
$data の各要素を、$schema の型情報に従って変換して返す。
- private function _generateCreateTableCommand($table_name, $schema)
-
$table_name で指定された名称のテーブルを、$schema のスキーマ情報に基づき作成する SQL コマンド文字列を生成し返す。
- private function _fgets($handle)
-
バッファ(1レベル) 読み戻しをサポートするための fgets() のラッパーメソッド。読み戻しは _fungets($handle, $str) で行う。
- private function _fungets($handle, $str)
-
1レベルだけ読み戻しをサポートするメソッド。読み取りは _fgets($handle) で行う。
- private function _get_schema($fp, $actual_settings)
-
オープンした CSV ファイルおよび指定オプションからスキーマを生成し、連想配列として返す。
- private function _str_getcsv($string)
-
CSV ファイルの現在位置から1行読み込み、フィールドに分解して内部文字コードの文字列を要素とする配列として返す。読み込みファイルのエンコードはビヘイビアオプションで指定する。
CsvLoader ビヘイビアを使用したモデルのサンプルを以下に示す。
制限事項
このビヘイビアでは、スキーマの変更のため CSV ファイルの読み込みに先立ちデータベース上の既存テーブルを DROP TABLE IF EXISTS で削除する。この処理は CakePHP の $model->query() メソッドで行うことになるが、当該モデルに対応するテーブルがデータベース上に存在していない場合エラーになってしまう。
このため、本ビヘイビアを利用する際には、中身は空で構わないしフィールドもデータに一致しなくて構わないのでテーブル (上記のサンプルコードの例では 'csv_loader_tests') を事前に作成しておく必要がある。
サンプルページ
このビヘイビアで実装したサンプルページ: CsvLoader Behavior demonstration (中部電力の年間電力使用量データの CSV を読み込み、特定日をピックアップしてグラフ表示する)
関連エントリー
- 2018/04/14
- CakePHP のレンダリング結果を保存したい
- 2017/09/06
- CakePHP 2.x の Cookie と js.cookie.js
- 2017/07/08
- 時刻入力用 jQuery Plugin TimePicki の不具合調整
- 2017/06/18
- CakePHP プラグインで HTTPS 判定
- 2016/02/27
- 作業用モデルビヘイビア
- 2016/01/16
- CakePHP のバリデーション時に状況に応じてバリデーションルールを変更する
- 2015/10/24
- CsvLoader ビヘイビアを使って CSV を一発でロードする Cake Shell
- 2015/07/04
- CakePHP の Security コンポーネント、ベーシック認証、CGI
- 2015/05/09
- 形態素解析システム MeCab (めかぶ) を CakePHP から利用する
- 2015/04/25
- Google APIs Client Library を CakePHP から利用する
- 2015/04/11
- 分数電卓を作ってみる・その2
- 2015/03/10
- 分数電卓を作ってみる・その1
- 2015/01/24
- CakePHP でストアドファンクション
- 2015/01/17
- テキストフィールドを CSV として処理する CakePHP ビヘイビア・補足
- 2014/12/20
- テキストフィールドを CSV として処理する CakePHP ビヘイビア・その2
- 2014/12/13
- テキストフィールドを CSV として処理する CakePHP ビヘイビア・その1
- 2014/11/24
- Google Maps で郵便番号⇒住所変換・その2
- 2014/10/25
- テキストを自動整形する簡易 CakePHP ヘルパー
- 2014/10/11
- Google Chart へのアクセスをヘルパーで実装してみる【その2】
- 2014/09/16
- Google Chart へのアクセスをヘルパーで実装してみる【その1】
- 2014/09/06
- Google reCAPTCHA を使いやすくする
- 2014/08/09
- 駅データ.jp のデータを CakePHP から使う
- 2014/07/26
- CakePHP の小ネタ
- 2014/07/03
- UploadPack を Exif Orientation 対応にする
- 2014/06/28
- 作業用テーブル処理を再利用可能なツール化してみる・その1
- 2014/03/08
- クリックイベントが2回実行される?!
- 2014/01/18
- CakePHP のフォームで required・その2
- 2013/12/07
- CakePHP のフォームで required
- 2013/11/23
- UploadPack のヘルパーメソッド名称が変わっていた
- 2013/11/09
- CakePHP 2.x の PaginatorHelper::sort の不思議
- 2013/07/13
- CakePHP で四苦八苦 - あるフィールドにだけ値が書き込まれない
- 2013/06/22
- UploadPack で四苦Hack その後
- 2013/05/25
- CakePHP の小ネタ
- 2013/04/29
- CakePHP v2 のエラー処理
- 2013/03/23
- IE10 と CKEditor
- 2013/02/09
- UploadPack で四苦Hack・その2
- 2013/01/26
- Paginator で見かけの URL を使用する方法
- 2013/01/12
- 「Notes プラグインが見つかりません」
- 2012/12/03
- CakePHP v2 で HTTP エラー画面をカスタマイズする
- 2012/11/12
- UploadPack で四苦Hack
- 2012/10/27
- PHP 5.4 と CakePHP 2.x
2020/12/15
2020/11/12
2020/10/05
2020/09/11
2020/08/03