CakePHP3上でSplFileObjectオブジェクトを使ったCSV処理。
Import
Taskクラスにて、SplFileObjectオブジェクトでCSVファイル読込処理実施。
namespace App\Shell\Task;
use Cake\Console\Shell;
use \SplFileObject;
use \Exception;
class UtilTask extends Shell
{
public function readCsv($targetFile)
{
if (!file_exists($targetFile)) {
return null;
}
try {
$csv = $this->createSplFile($targetFile);
$csv->setFlags(SplFileObject::READ_CSV);
return $csv;
} catch (Exception $e) {
// 例外対応
return null;
}
}
private function createSplFile($path, $option = "")
{
if ($option !== "") {
return new SplFileObject($path, $option);
}
return new SplFileObject($path);
}
}
shell内で読み込んだCSVファイル情報をループ処理。
namespace App\Shell;
use Cake\Console\Shell;
class CsvShell extends Shell
{
public $tasks = ['Util'];
public function initialize()
{
parent::initialize();
$this->loadModel('MCompanies');
}
public function import($filename)
{
$targets = $this->Util->readCsv($filename);
if (is_null($targets)) {
// エラー処理
return;
}
// 何かしらの処理
foreach ($targets as $target) {
echo $target[0] . PHP_EOL;
echo $target[1] . PHP_EOL;
echo $target[2] . PHP_EOL;
}
}
}
実行時コマンドと実行結果↓
bin\cake csv import test.csv
1
test1
abcde1
2
test2
abcde2
Export
Taskクラスにて、SplFileObjectオブジェクトでCSVファイル出力処理実施。
namespace App\Shell\Task;
use Cake\Console\Shell;
use \SplFileObject;
use \Exception;
class UtilTask extends Shell
{
public function createCsv($targets, $filename)
{
try {
$csv = $this->createSplFile($filename, "w");
foreach ($targets as $target) {
$csv->fputcsv($target);
}
return true;
} catch (Exception $e) {
// 例外対応
return false;
}
}
private function createSplFile($path, $option = "")
{
if ($option !== "") {
return new SplFileObject($path, $option);
}
return new SplFileObject($path);
}
}
DBから適当なデータを取得します。
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class MCompaniesTable extends Table
{
// 一部省略
/**
* 会社マスタ取得
*
* @return array
*/
public function getCompanies()
{
try {
$query = $this->find();
return $query->hydrate(false)->toArray();
} catch (Exception $e) {
// 例外対応
return array();
}
}
}
DBからデータ取得後、CSVファイルに書き出すshellクラスを定義。
namespace App\Shell;
use Cake\Console\Shell;
class CsvShell extends Shell
{
public $tasks = ['Util'];
public function initialize()
{
parent::initialize();
$this->loadModel('MCompanies');
}
public function export()
{
$companyList = $this->MCompanies->getCompanies();
if (count($companyList) === 0) {
// エラー処理
return;
}
$filename = "test.csv";
if ($this->Util->createCsv($companyList, $filename) === false) {
// エラー処理
return;
}
$this->out("CSVファイル作成完了.");
}
}
実行時コマンドと実行結果↓
bin\cake csv export
CSVファイル作成完了.