« 本番サーバに配置でハマる | メイン | cake1.2でbakeを使う »

CSVファイルをDBにインポート

サーバのテーブルに,CakePHP経由でアップロードしたCSVファイルをインポートする必要がありましたので,その処理を作ってみました。CSVファイルをサーバにアップロードし,そのファイルをDBにインポートするという手順になろうかと思います。

ビュー

<div class="options form">
<div class="actions">
    <ul>
        <li><?php echo $html->link('メニューに戻る', array('action'=>'index'));?></li>
    </ul>
</div>
<?php echo $form->create('Options', array('action'=>'upload', 'type' => 'file'));?>
    <fieldset>
        <legend>データのアップロード</legend>
    <?php
        echo $form->file('result');
    ?>
    </fieldset>
<?php echo $form->end('アップロード');?>
</div>
 

$form->createでtypeをfileにする。するとSubmitするとファイルがtmpフォルダにアップロードされます。

コントローラ

    function upload(){
        if (!empty($this->data)) {
            $model =& $this->Result;
            /* @var $model result */
            $up_file = $this->data['Options']['result']['tmp_name'];
            $fileName = CSV_FILE_PATH."result.csv";
            if (is_uploaded_file($up_file)){
                move_uploaded_file($up_file, $fileName);
                $model->loadFromCSV($fileName);         
                $this->Session->setFlash('データをアップロードしました。');
                $this->redirect(array('action'=>'index'));
            }
        }
    }
 

コントローラでは,返された$this->dataの'tmp_name'の中にアップロードされたファイル名が入っています。上記のコードでは,それのファイルをmove_uploaded_file関数で,特定の場所に保存しています。その後,モデルに定義したloadFromCSVメソッドでDBに読み込んでいます。

モデル

    function loadFromCSV($fileName) {
        $this->begin();
        try{
            $this->deleteAll('1 = 1', false);
            $csvData = file($fileName, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
            foreach($csvData as $line){
                $record = split(",", $line);
                $data = array(
                    "field1" => $record[0],
                    "field2" => $record[1]
                );
                $this->create($data);
                $this->save();
            }
            $this->commit();
        } catch(Exception $e) {
            $this->rollback();
        }
    }
 

モデルに定義したloadFromCSVメソッドは上記の通りです。ファイルをfile関数で読み込み,各行をsplitで分割してフィールドにセットしています。MySQLにはファイルからデータをインポートするSQL文もあるので,それを使おうかとも思ったのですが,CakePHPの機能で実装しました。

大変な処理かと思ったのですが,わりと簡単に実現できました。

« 本番サーバに配置でハマる | メイン | cake1.2でbakeを使う »

関連するエントリー

トラックバック

このエントリーのトラックバックURL:
http://mt.sunvisor.net/mt-tb.cgi/70

コメントを投稿

About

2008年12月03日 14:17に投稿されたエントリーのページです。

ひとつ前の投稿は「本番サーバに配置でハマる」です。

次の投稿は「cake1.2でbakeを使う」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

オススメの本

CakePHP初の公認ガイドブック。まずこれを読む。

CakePHPでの開発の際には常に机上に準備するべし。

CakePHP 1.2を使い始めるならこの本が必携。

2008年12月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のコメント

最近のトラックバック

Powered by
Movable Type 3.35