DEVELOPERS BLOGデベロッパーズブログ
しばしば CSV データをデータベース (テーブル) として処理したいことがある。(電力会社から公開される電力使用量データや総務省から公開される全国市区町村一覧等々。)
CsvSource データソースを利用する方法もあるが、こちらは find 時の絞り込み条件指定等は対応していないようで全件読み込み以外の処理には難があるようだし、他のテーブルとのアソシエーションにも難がありそうだし、ロードした後継続的にテーブルとして使用する場合は自分で CSV のフィールドを調べてテーブルを作成し、内容をコピーするようコードを書かなければならない。
それならば、モデルを最初にアクセスする際に CSV ファイルの構造からテーブルを作成しそこに読み込んでしまい、それ以降は通常のデータベーステーブルとしてアクセスする方法があればよいのではないだろうか。
この方法であれば Behavior として実現できそうだし、他のテーブルとのアソシエーションも容易なので試してみた。
コンセプト
使用に先立ち、CSV データを既存またはその時点で作成したテーブルにロードしてしまえば CRUD 部分は通常のデータベースとしてアクセスするだけなので、ビヘイビアの初期化部分 (setup() メソッド) で対応する。
書き込み先テーブルを生成する場合は、その構造 (スキーマ) をユーザが指定することもできるが、可能な限り自動生成できるようにする。
ビヘイビア名を CsvLoader とすると、以下のような感じになる。
使用する際には、Model 定義で以下のようにする。
実装
上記を実現するためのビヘイビアの setup() コールバックメソッドの構造は以下のようにできる。
- ビヘイビアの生成オプションと既定値オプションをマージする
- CSV ファイルをオープンする
- テーブルを構築するためのスキーマデータをオプションに従って生成する
- データベースにテーブルを作成する
- CSV ファイルからレコードを読み込みテーブルに書き込む
- EOF に達したらファイルをクローズする
これをコード化したものがこちら。(抜粋)
細かい内部メソッドや省略されている要素にについては次回解説の予定。
この記事は加藤 正人さんが書いています!
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
2020/12/15
2020/11/12
2020/10/05
2020/09/11
2020/08/03