勉強したことのメモ

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

  関連記事

phpdotenvライブラリを使用してPHPで.envファイルを読み込ませる方法

CodeIgniterを勉強していた際に各種設定は「.env」というファイルに記 ...

PHPでダミー画像(プレースホルダー画像)を表示する「PHP-Dummy-Image-Generator」の利用方法

先日JavaScriptでダミー画像(プレースホルダー画像)を表示する「Hold ...

PHPで簡単にCSVファイルの生成

簡単にデータ並べるだけのCSVファイル生成。 file_put_contensで ...

PHPにて「hashids(Sqids)」ライブラリで数値からユニークなランダム英数字のIDに変換する方法

PHPにてユーザID等を推測されないよう数値のIDからユニークなランダム英数字の ...

PHPのエラーメッセージ及びvar_dumpを見やすく表示するライブラリ「Tracy」の利用方法

ここのところPHPでの開発時にvar_dumpをツールバー表示する「Kint」及 ...