PHPでCSVファイルの読み込みを行う方法 : file() , fgetcsv()

CSVファイルとはComma-Separated Valuesのことで、データを項目毎にカンマで区切ったテキストファイルです。

Excelなど多くのアプリケーションからCSV形式でデータを保存することができるため、データのやりとりによく利用されています。

ここではPHPでCSVファイルを読み込む方法を見ていきます。

CSVファイルの例

CSVファイルと一口に言っても実際にはさまざまな形式があります。

ここではもっとも単純な形式ということで以下のような例を用意しました。

1,りんご,100
2,みかん,150
3,いちご,200

商品を表すデータで一行が一件のデータを表します。

最初の行では商品番号が1,商品名が「りんご」、単価が100円というわけです。それぞれがカンマ(,)で区切られています。

このような形式で保存されているファイルがCSVファイルです。

このファイルが「data.csv」というファイル名で保存されているとします。

PHPでのファイルの読み込み

PHPスクリプトと同じディレクトリに data.csv があるとします。

このとき、ファイルを読み込む方法はいろいろありますが、CSV形式の場合、一行一件のデータとなっているため、一行毎に読み込んだ方がよいでしょう。

PHPには一行毎に配列として読み込む関数 file() があります。これを使えば簡単にファイルを一行ごとに配列として読み込むことができます。

$lines = file('data.csv');

この例では $lines 変数に data.csv の内容を読み込んでいます。

fileで返される値は配列なので 、$lines[0]には1行目が、$lines[1]には2行目が、$lines[2]には3行目が入ります。

このため、全ての行を処理するためには foreachを使えば簡単です。

foreach($lines as $line){
  // $line に一行ずつ入る
}

内容の表示

ここでは全ての行の内容を単純に表示してみます。

foreach()を使って一行ずつ $line に入ってきますので、これをまずはカンマで分割しなくてはなりません。

そのためには、explode() 関数を使います。

$data = explode(',',$line);

explode()関数では最初の引数に区切り文字(今回はカンマ)、そして二番目の引数に文字列を与えます。その結果、文字列を区切り文字で分割した配列が得られます。

つまり、$dataは一行をカンマで分割した配列です。
ここでは単純にそれを表示してみます。

echo '<p>';
echo ' No.',$data[0];
echo ' 商品名:',$data[1];
echo ' 単価:',$data[2];
echo '</p>';

ここまでをまとめると以下のようになります。

$lines = file('data.csv');

foreach($lines as $line){
	$data = explode(',',$line);
	
	echo '<p>';
	echo ' No.',$data[0];
	echo ' 商品名:',$data[1];
	echo ' 単価:',$data[2];	
	echo '</p>';
}

fgetcsvの使用

単純なCSVファイルの場合、以上で可能ですが、例えば項目が""で囲まれているようなCSVファイルだとこの場合、読み込んだ内容にも""が付属してしまいます。

1,"りんご",100
2,"みかん",150
3,"いちご",200

このような場合、fgetcsv()を使用します。

まず、fopen()関数でファイルを開き、その戻り値をfgetcsv()に渡し、一行ずつ読み込んでいきます。

$fp = fopen('data.csv', 'r');
while (($data = fgetcsv($fp)) !== FALSE) {
	echo '<p>';
	echo ' No.',$data[0];
	echo ' 商品名:',$data[1];
	echo ' 単価:',$data[2];	
	echo '</p>';
}
fclose($fp);

fgetcsv()では読み込んだ行を分割し配列にして返します。また、""で囲まれている項目はそれを外して返してくれます。

fgtecsv()の戻り値がFALSEになると最後までファイルを読み込んだことになりますので、while文でFALSEじゃない間だけ繰り返します。

最後にfclose()を行ってファイルを閉じます。

文字コードについて

PHPスクリプトのファイルは通常は文字コードUTF-8で作成しますが、読み込むデータファイルがシフトJISなどUTF-8では無い場合、文字コードを変換する必要があります。

例えば、上のfgetcsv()を使う例では $data[1]には日本語が入っている可能性がありますので表示する前に、mb_convert_encoding()で変換します。

$data[1] = mb_convert_encoding($data[1],"utf-8","sjis");

また、fgetcsv()を使う場合、環境によっては文字コードを正しく認識できない場合があるため、setlocale()を行ってあらかじめ文字コードを指定しておくと良いでしょう。

setlocale(LC_ALL, 'ja_JP.SJIS');

まとめ

CSVファイルは単純な形式のため、Excelなど他のアプリケーションでも非常に良く利用されます。

しかし、形式の微妙な違いや文字コードによって処理が異なることもあります。

処理を作成する前に事前にどのような形式のCSVファイルなのかをよく確認して置いた方が良いでしょう。