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

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. CsvLoader ビヘイビアを使って CSV を一発でロードする Cake Shell

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

加藤 正人

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

加藤 正人

2015/10/24

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

 

今さらながら、の CakePHP v2.x の話題で恐縮だが、先日 4MB を超える CSV をデータベースに取り込む話があった。

通常なら phpMyAdmin のインポート機能で行うことになるが、この機能はフォームからのファイルアップロードでデータを読み取る。ところが今回のサーバではアップロードファイルサイズに制限 (2MB まで) があるため、この方法では対応できないことが判明した。

テキストエディタでファイルを分割してアップロードも考えたが、CSV が更新されるたびにそのような手間はかけたくない、ということで以前作った CsvLoaderBehavior を Console Shell で使ってロードして対応してみた。

それに先立ち、CsvLoaderBehavior の一部を修正したのでここに追記しておく。

CsvLoaderBehavior クラスの setup メソッドを上記のもので置換することで、テーブルが存在しない場合に表示されるエラーを抑制することができる。

これを使った Cake Shell の例はこちら。

この例では、Shift_JIS コードで記述された CSV ファイルを読み込み、1行目をフィールド名としてスキーマを生成し、data_tests というテーブルを作成してデータを書き込んでいる。

上の例の場合、各フィールドは VARCHAR(512) 型フィールドとして保存される。また既に data_tests テーブルが存在している場合は一旦 DROP TABLE してから新規に作り直す。モデル名は任意の名称で構わない。また、テーブル名とモデル名の関係は CakePHP の規則に任せるのであれば Model 定義は不要。

フィールド型設定が必要な場合は、'schema' パラメータで詳細に設定することもできる。

この方法であれば、アップロード制限のない別の方法 (たとえば FTP 等でサーバにアップロードしてローカルファイルとしてアクセスするとか、あるいは HTTP 経由で見える場所に CSV を置いてファイル名を URL で指定するなど) で CSV を読み取り一発でテーブルにロードできる。

この Cake Shell を cron で実行すれば、定期的に CSV を読み込んでテーブル全体を更新するような用途にも利用可能だ。

関連タグ: Cron  CakeShell  PHP  CSV  CakePHP2  CsvLoaderBehavior 

関連エントリー

PHP で HTML を処理したい

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

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

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

Fedora 24 ⇒ Fedora 25 アップグレードとPHP 7.0 ⇒ 5.6 ダウングレード

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

CakePHP プラグインで HTTPS 判定

作業用モデルビヘイビア

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

PHP 5.3 のクロージャの続き

CKFinder v3.x で躓いた点

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

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

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

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

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

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

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

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回実行される?!

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