CSV.

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ファイル作成完了.
Fin.