LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

【CakePHP3】SplFileObjectでのCSV処理

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up