PHPでCSVを簡単に取り扱える「LeagueCSV(thephpleague / csv)」の利用方法
PHPでCSVファイルの書き込みや読み込みを行う際、バニラPHPで対応していたが、これをライブラリで簡素化させたい。「LeagueCSV(thephpleague / csv)」がComposer無しで導入でき、使用方法も難しくなさそう。以下にインストール方法と使用方法をメモ。
目次
LeagueCSV(thephpleague / csv)
公式サイト
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 Simple HTML DOM Parserを使用したスクレイピング方法
PHPでスクレイピングする際、preg_match_all等を用いて必要なデータ ...
-
-
PHPでOGPタグ(metaタグ)を簡単に取得できる「OpenGraph.php」の利用方法
PHPでOGPタグ(metaタグ)を取得する際、file_get_content ...
-
-
PHPでvar_dumpをツールバー形式で表示するライブラリ「Kint」の使い方
PHPでvar_dumpを見やすくするためにdBugライブラリを利用しているが、 ...
-
-
PHPのバリエーションライブラリ「Valitron」の導入及び利用方法
フォーム等の入力内容チェックをPHP側で行う際、現状は素のPHPで書いているけど ...
-
-
CSVファイルを使って郵便番号から住所を抽出する
■ソース <? error_reporting(E_ALL & ~ ...