勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでCSVを簡単に取り扱える「LeagueCSV(thephpleague / csv)」の利用方法

  PHP

PHPでCSVファイルの書き込みや読み込みを行う際、バニラPHPで対応していたが、これをライブラリで簡素化させたい。「LeagueCSV(thephpleague / csv)」がComposer無しで導入でき、使用方法も難しくなさそう。以下にインストール方法と使用方法をメモ。

 

LeagueCSV(thephpleague / csv)

公式サイト

https://csv.thephpleague.com/

Github

https://github.com/thephpleague/csv

ドキュメント

https://csv.thephpleague.com/9.0/

 

インストール

システム要件

mbstring拡張モジュールが必要。必要に応じて以下コマンドでインストールしておく。

dnf -y install php-mbstring

また、ライブラリのバージョンによって対応するPHPのバージョンも異なる。PHP7系ならライブラリは9.0.0を、PHP8系なら最新のものを利用するのが良さそう。詳細は公式ページを参照すること。

composerでインストールする場合

サーバにSSH接続し以下コマンドでインストールする。

composer require league/csv:^9.0

手動でインストールする場合

こちらのページから好きなバージョンのzipをダウンロード及び展開の上で適当なディレクトリにアップロードする。PHPファイル側で以下の形で呼び出す。

require '/path/to/league/csv/autoload.php';

 

利用方法

読み込み

use League\Csv\CharsetConverter;
use League\Csv\Reader;
use League\Csv\Writer;

require 'csv/autoload.php';

$csv = Reader::createFromPath('sample.csv', 'r');

//ヘッダー設定(1行目がヘッダー)
$csv->setHeaderOffset(0);

//SJIS-win->UTF8に変換
CharsetConverter::addTo($csv, 'SJIS-win', 'UTF-8');

foreach( $csv as $row ){
    var_dump($row);
}

書き込み

use League\Csv\CharsetConverter;
use League\Csv\Reader;
use League\Csv\Writer;

require 'csv/autoload.php';

$data = array(
    array('name' => '田中' , 'age' => 20),
    array('name' => '鈴木' , 'age' => 30),
    array('name' => '山田' , 'age' => 40),
);

$writer = Writer::createFromPath('./test.csv', 'w+');

//タイトル書き込み
$writer->insertOne(['名前', '年齢']);
$writer->insertAll($data);

出力(ダウンロードさせる)

$name = date('Ymdhis') . '.csv';
$writer = Writer::createFromPath($name, 'w+');
$writer->insertAll($data);

header('Content-Type: text/csv; charset=UTF-8');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="' . $name . '"');

$reader = Reader::createFromPath($name, 'r');
$reader->output();
die;

上記はデータをCSVに書き込んだ後に出力(ダウンロード)させる形。尚、書き込んだファイルはサーバに保存されないのでunlink等で削除する必要は無し。

 

処理速度及びメモリ使用量の比較

比較内容

以前に取得した市区町村データを使う。全部だと多すぎるので北海道のデータ(10,302行)をMySQLから取り出してCSVファイル化してサーバに保存する、という内容をバニラPHPとライブラリを使った場合で比較する。

尚、バニラPHPは以下のようにストリームラッパー等は考慮しない形で作成した。

$csv = '';
foreach( $data as $val ){
    $csv .= implode(",", $val) . "\n";
}

$file = date("YmdHis") . ".csv"; 
file_put_contents($file, $csv, LOCK_EX);

結果

5回ずつ試した平均値は以下の通り。

処理速度(秒) メモリ使用量(MB)
バニラPHP 0.008453417 1.706314087
ライブラリ 0.078366804 0.008811951

処理速度はバニラPHPの方が10倍ほど速く、メモリ使用量はライブラリの方が200倍ほど少ないという結果になった。

 

所感

バニラPHPと比較するとシンプルなコードで実装できる点とメモリ使用量を大幅に抑えられる点がメリット。

処理速度に関して目を瞑ることができるのであればライブラリを使用した方が良さそう。

また、Composer無しでもインストールできるという点がありがたい。

尚、CSV系のライブラリだと「parsecsv / parsecsv-for-php」「goodby / csv」というのもあるみたい。

 - PHP

  関連記事

PHPでエラーメッセージを見やすくするwhoopsの利用方法

PHPのエラーメッセージが見づらい。これはこういうもの、と諦めていたがCodei ...

PHPでJavaScriptを圧縮するライブラリ「JShrink」の利用方法

サイト内でJavaScriptを用いる場合、外部のライブラリやプラグインだと圧縮 ...

Composer無し&ファイル1枚でPHPのエラーメッセージ画面をリッチにするライブラリ「PHP Error」の利用方法

先日PHPのエラーメッセージを見やすくするwhoopsの利用方法をメモしたが導入 ...

PHPでルーティング用ライブラリ「AltoRouter」の利用方法

PHPフレームワークのCodeIgniterを勉強していた際にルーティング機能が ...

PHPで住所や名前のテキストをランダム生成するライブラリFakerPHPの使い方

PHPでランダムなデータを生成したい際に値段や点数等の数値やパスワード等のランダ ...