CakePHPでCSVをインポートするならCakeDCのCsvImport Behaviorが一番良さそう

CSVのインポートをしたいということで、探してみるといいものがありました。

https://github.com/CakeDC/utilsで公開されているUtils Pluginの一部。CsvImport Behaviorです。

ドキュメントにはPHP5.2以上と書かれていますが、CsvImport Behaviorについては、PHP5.1.6でも動いています。

使い方

こんな感じ。usersテーブルへの追加の場合。

Controllerの準備

function import() {
	$filename = TMP . 'user.csv';
	if(file_exists($filename)) {
		$db = $this->User->getDataSource();
		$db->begin($this->User);
		$this->User->deleteAll('1 = 1');
		$this->User->importCSV($filename);
		if($this->User->getImportErrors()) {
			$db->rollback($this->User);
			$this->Session->setFlash(__('Incorrect data type. Please, try again.', true));
		} else {
			$db->commit($this->User);
			$this->Session->setFlash(__('The import was successful.', true));
		}
	} else {
		$this->Session->setFlash(__('Failed to import data. Please, try again.', true));
	}
	$this->redirect(array('action' => 'index'));
}

$this->User->deleteAll(‘1 = 1’); は、データを全部削除する為のもの。
はじめは、truncateを使っていましたが、ロールバック出来ない為、deleteに変更しました。

Modelの準備

区切り文字がデフォルトでは「;」になっているので、「,」になるように指定

var $actsAs = array(
	'CsvImport' => array(
		'delimiter'  => ',',
	)
);

CSVファイルを用意する

CSVの1行目がキモで、フィールド名と同じにしておくと、自動的に関連付けてくれます。(hasHeaderがtrueの場合。デフォルトはtrue)

"name","mail","tel","zipcode","address"
"hogehoge1","hogehoge1@example.com","09012345671","1600001","東京都新宿区xxxxxxxxxxxxxxxxxxxx"
"hogehoge2","hogehoge2@example.com","09012345672","1600002","東京都新宿区xxxxxxxxxxxxxxxxxxxx"
"hogehoge3","hogehoge3@example.com","09012345673","1600003","東京都新宿区xxxxxxxxxxxxxxxxxxxx"
"hogehoge4","hogehoge4@example.com","09012345674","1600004","東京都新宿区xxxxxxxxxxxxxxxxxxxx"
"hogehoge5","hogehoge5@example.com","09012345675","1600005","東京都新宿区xxxxxxxxxxxxxxxxxxxx"

CSVファイルはFTPでアップするなり、フォームからアップロードするなりで対応すればOK。

これでスルッとCSVのデータがインポートされます。素晴らしい!

“CakePHPでCSVをインポートするならCakeDCのCsvImport Behaviorが一番良さそう” への1件のコメント