PHP でCSVファイルを読み込む方法について説明していきます。fopen で1行つづ読み込んで処理することもできますが、もっと簡単にCSVを読み込めるライブラリも用意されております。
PHP でCSVファイルを読み込む方法をいくつか紹介したいと思います。
1行づつ読み込んでから分割する
1行づつファイルを読み込んでから、カンマ区切りのデータを分割するプログラムについて説明します。
読み込むCSVファイル(read.csv):
aaa,bbb,ccc
ddd,eee,fff
プログラム:
// 読み込みモードでファイルを開く
$fp = fopen('read.csv', 'r');
// ファイルを1行ずつ読み込む
while( $line_txt = fgets($fp) ) {
// カンマ区切りのデータを分割して配列に格納
$array[] = preg_split("/[\t,]/", $line_txt);
print_r($array);
}
// ファイルを閉じる
fclose($fp);
実行結果:
Array
(
[0] => aaa
[1] => bbb
[2] => ccc
)
Array
(
[0] => ddd
[1] => eee
[2] => fff
)
プログラム解説
PHP でのファイル読み込みの詳細については次の記事を確認してください。
preg_split 関数を使用することで、カンマ区切りの文字列を分割してそれぞれ配列に格納しております。第一引数に「/[\t,]/」を指定することで、カンマ区切りにもタブ区切りにも対応しております。
カンマのみでいい場合は、この部分は explode 関数や str_getcsv 関数を使用して次のように書くこともできます。
$array = explode(",", $line_txt);
$array = str_getcsv($line_txt, ",");
SplFileObject クラスを使用する
もう一つの方法として、PHPに実装されているのライブラリ(SplFileObject)を使用して簡単にCSVファイルを読み込むことができます。
プログラム:
$csv_file = new SplFileObject('read.csv');
$csv_file->setFlags(SplFileObject::READ_CSV);
foreach ($csv_file as $line_txt) {
print_r($line_txt);
}
実行結果:
Array
(
[0] => aaa
[1] => bbb
[2] => ccc
)
Array
(
[0] => ddd
[1] => eee
[2] => fff
)
プログラム解説
setFlags メソッドで指定できる引数は、SplFileObject::READ_CSV 意外にも次のようなものがあります。
- SplFileObject::DROP_NEW_LINE
- SplFileObject::READ_AHEAD
- SplFileObject::SKIP_EMPTY
空行を読み飛ばしたりする設定ですが、複数指定する場合は|で区切ります。詳細については、「SplFileObject」でネット検索してみてください。
$csv_file->setFlags(
SplFileObject::READ_CSV |
SplFileObject::DROP_NEW_LINE |
SplFileObject::READ_AHEAD |
SplFileObject::SKIP_EMPTY
);
SplFileObject クラスを使用したCSVファイル読み込みは、別の書き方もあり、同様の結果を得ることができます。
$csv_file = new SplFileObject('read.csv');
while ( !$csv_file->eof() ) {
print_r($csv_file->fgetcsv());
}
コメント
Thanks for the information provided