DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2015/02/14

CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法

 

しばしば CSV データをデータベース (テーブル) として処理したいことがある。(電力会社から公開される電力使用量データや総務省から公開される全国市区町村一覧等々。)

CsvSource データソースを利用する方法もあるが、こちらは find 時の絞り込み条件指定等は対応していないようで全件読み込み以外の処理には難があるようだし、他のテーブルとのアソシエーションにも難がありそうだし、ロードした後継続的にテーブルとして使用する場合は自分で CSV のフィールドを調べてテーブルを作成し、内容をコピーするようコードを書かなければならない。

それならば、モデルを最初にアクセスする際に CSV ファイルの構造からテーブルを作成しそこに読み込んでしまい、それ以降は通常のデータベーステーブルとしてアクセスする方法があればよいのではないだろうか。

この方法であれば Behavior として実現できそうだし、他のテーブルとのアソシエーションも容易なので試してみた。

コンセプト

使用に先立ち、CSV データを既存またはその時点で作成したテーブルにロードしてしまえば CRUD 部分は通常のデータベースとしてアクセスするだけなので、ビヘイビアの初期化部分 (setup() メソッド) で対応する。

書き込み先テーブルを生成する場合は、その構造 (スキーマ) をユーザが指定することもできるが、可能な限り自動生成できるようにする。

ビヘイビア名を CsvLoader とすると、以下のような感じになる。

使用する際には、Model 定義で以下のようにする。

実装

上記を実現するためのビヘイビアの setup()  コールバックメソッドの構造は以下のようにできる。

  1. ビヘイビアの生成オプションと既定値オプションをマージする
  2. CSV ファイルをオープンする
  3. テーブルを構築するためのスキーマデータをオプションに従って生成する
  4. データベースにテーブルを作成する
  5. CSV ファイルからレコードを読み込みテーブルに書き込む
  6. EOF に達したらファイルをクローズする

これをコード化したものがこちら。(抜粋)

細かい内部メソッドや省略されている要素にについては次回解説の予定。

関連タグ: CSV  MySQL  Behavior  CakePHP2 

関連エントリー

CakePHP3 で created と modified に日付が自動付与されない場合のメモ

MySQL にタイムゾーンを追加する

別PCからMySQLサーバーをアクセスする

CakePHP のレンダリング結果を保存したい

CakePHP 2.x の Cookie と js.cookie.js

時刻入力用 jQuery Plugin TimePicki の不具合調整

CakePHP プラグインで HTTPS 判定

作業用モデルビヘイビア

CakePHP のバリデーション時に状況に応じてバリデーションルールを変更する

CsvLoader ビヘイビアを使って CSV を一発でロードする Cake Shell

CakePHP の Security コンポーネント、ベーシック認証、CGI

形態素解析システム MeCab (めかぶ) を CakePHP から利用する

Google APIs Client Library を CakePHP から利用する

分数電卓を作ってみる・その2

分数電卓を作ってみる・その1

CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法・その2

CakePHP でストアドファンクション

テキストフィールドを CSV として処理する CakePHP ビヘイビア・補足

テキストフィールドを CSV として処理する CakePHP ビヘイビア・その2

テキストフィールドを CSV として処理する CakePHP ビヘイビア・その1

Google Maps で郵便番号⇒住所変換・その2

テキストを自動整形する簡易 CakePHP ヘルパー

Google Chart へのアクセスをヘルパーで実装してみる【その2】

Google Chart へのアクセスをヘルパーで実装してみる【その1】

Google reCAPTCHA を使いやすくする

駅データ.jp のデータを CakePHP から使う

CakePHP の小ネタ

UploadPack を Exif Orientation 対応にする

作業用テーブル処理を再利用可能なツール化してみる・その1

クリックイベントが2回実行される?!

MySQL で「指定した順序で結果を取得」

CakePHP のフォームで required・その2

CakePHP の Paginator の sort() で昇順ソート時に NULL 値を最後にしたい

CakePHP のフォームで required

UploadPack のヘルパーメソッド名称が変わっていた

CakePHP 2.x の PaginatorHelper::sort の不思議

CakePHP で四苦八苦 - あるフィールドにだけ値が書き込まれない

UploadPack で四苦Hack その後

CakePHP の小ネタ

CakePHP v2 のエラー処理

IE10 と CKEditor

2013/03/23
IE10 と CKEditor

UploadPack で四苦Hack・その2

Paginator で見かけの URL を使用する方法

「Notes プラグインが見つかりません」

CakePHP v2 で HTTP エラー画面をカスタマイズする

UploadPack で四苦Hack

PHP 5.4 と CakePHP 2.x