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 を読み込み、特定日をピックアップしてグラフ表示する)
関連エントリー
- 2015/01/17
- テキストフィールドを CSV として処理する CakePHP ビヘイビア・補足
2020/12/15
2020/11/12
2020/10/05
2020/09/11
2020/08/03