PHPでcsvファイルを読み込みする【初心者向け】
PHPを利用したWebサービスの中には、アップロードしたcsvのデータを読み込み、ブラウザ上に表示させるようなものがあります。
これはアップロードしたファイルをPHPの機能を使って読み込み、データベースに登録することで実現しています。
今回はこういったcsv形式のデータを処理するために必要なPHPの関数、fgetcsvについて解説します。
PHP fopenを使ってcsvファイル読み込み
外部ファイルからデータを読み込みするサービスは、Web上にいくつも存在します。
例えばcsvやテキストファイルをブラウザからアップロードし、ファイル読み込みを行った後で、何らかの処理をPHPの中でかけるケースが挙げられます。
こういったときに、PHPではfopenという関数を使います。fopenはfile openを意味しており、ファイル読み込みのときに活用します。
それではPHPコードの中でどのように書くのかを見てみましょう。
サンプルコード
ファイル読み出しのサンプルコードは以下のようになります。
<?php
$f = fopen("./sample.csv", "r");
fclose($f);
?>
fopenに渡す引数は主に2つです。
1つは開きたい外部ファイル名、もう1つはファイル操作モードです。上の例の場合ですと、ファイル名は"./sample.csv"、モードは "r"となっています。
モード"r"の意味は外部ファイルを読み込み、プログラム内で処理できる形式に変換するというものです。詳しいことは後で解説します。
また最後のfclose($f)ですが、これは開いたファイルを閉じる意味で使われます。
fopenで指定できるモードの種類
PHPのfopenでできることは大きく分けて2つあります。
それは「ファイル読み込み」と「ファイル書き出し」です。ここではこの2つをどのように使い分けるかを解説します。
このセクションで説明することはモードのほんの一部ですので、より詳しく知りたい方はPHP公式サイトを確認してみてください。
読み込みモード
さきほど示した例では、読み込みの"r"を使っていました。
rはreadの頭文字から来ており、上で説明したとおり「ファイル読み込み」の場合に使います。
モードの中にはrだけでなく、r+というものも存在します。こちらはrとなっていますが、読み・書きどちらも行えるという意味で使用できます。
一見便利そうですが、読み書きどちらも同時に行うということは、データをいつ読み・書きしているかを明示的に示していないことになります。そのため、r+の使用はお勧めしません。
書き込みモード
書き込みモードは"w"となっています。writeのwですね。
書き方はさきほど説明したfopenのサンプルコードにある"r"の部分を"w"とするだけです。
fopen("./sample.csv", "w");
"w"も"r+"と同様、"w+"というモードが存在します。こちらの使用も"r+"と同じ理由にて、お勧めしません。
fgetcsvとは
PHPのfgetcsvとはfopen "r"モードにて読み込みしたファイルのデータ形式がcsvだった場合、データ構造を配列にして出力する関数です。
そのためcsvの読み込み処理を行う際には、かならず使用する関数になります。
fgetcsv関数の書き方は以下の通りです。
fgetcsv($handle)
$handleには、fopenによって作成されたデータストリームを指定します。データストリームとは上に挙げたサンプルコード内にある"$f"のことです。
PHPのfgetcsvによって取得できたcsvデータの多重配列は、for文やwhile文を利用して1行の配列を順番に取得することができます。
fgetcsvを使ってcsvファイルを配列に変換する
今回サンプルコードとして取り上げているサンプルコードの流れは以下の通りです。
fopenを使って"r"モードでcsvを開き、読み込む
↓
fopenによって作成されたストリームをfgetcsvに渡し、PHP内でcsvデータの配列を作成する
↓
while文を使って、PHP内で生成されたcsvデータの多重配列から1行ずつ取り出し、HTML形式で表示させる
↓
最後にファイルをcloseする
それでは実際に、サンプルコードを確認していきましょう。
サンプルコード
今回読み込むサンプルcsvは以下の通りです。
左から順番に、ID、名前、性別、テストの点数としています。
sample.csv
1, 仁, 男, 100点
2, 銀, 男, 50点
3, 灯, 女, 70点
4, 凪, 女, 90点
5, 翼, 男, 27点
サンプルcsvをfopenの"r"モードで読み込み、HTMLへ出力するプログラムです。
sample.php
<?php
// #1 ファイルの読み込み
$f = fopen("./sample.csv", "r");
// #2 テーブルのHTMLを生成
echo "<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>性別</th>
<th>テストの点数</th>
</tr>";
// #3 csvのデータを配列に変換し、HTMLに埋め込んでいる
while($line = fgetcsv($f)) {
echo "<tr>";
for ($i=0;$i<count($line);$i++) {
echo "<td>" . $line[$i] . "</td>";
}
echo "</tr>";
}
echo "</table>";
// #4 ファイルを閉じる
fclose($f);
?>
ではサンプルコードの詳細を、少しずつ見ていきましょう。
// #1 ファイルの読み込み
$f = fopen("./sample.csv", "r");
まずは#1からです。
ここではfopenにて、sample.csvファイルを読み込みます。それによってストリームというデータ形式でcsvファイルが読み込まれるのでそれを$fへ代入しています。
// #2 テーブルのHTMLを生成
echo "<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>性別</th>
<th>テストの点数</th>
</tr>";
#2ではHTMLをechoを使って生成しています。
今回は読み込んだcsvファイルをテーブル形式に変換するため、ここでテーブルのヘッダを定義しています。ヘッダ名はcsvのデータ内容と一致する必要があるため、ID、名前、性別、テストの点数、としています。
// #3 csvのデータを配列に変換し、HTMLに埋め込んでいる
while($line = fgetcsv($f)) {
echo "<tr>";
for ($i=0;$i<count($line);$i++) {
echo "<td>" . $line[$i] . "</td>";
}
echo "</tr>";
}
echo "</table>";
#3の処理が今回もっとも重要なポイントになります。
まずは$line = fgetcsv($f)で、$lineにcsvから読み込んだ配列を、代入しています。さらにwhile文で配列を1行ずつ取得しています。
$lineの中は[1, 仁, 男, 100点]という配列が入っています。
さらにfor文の内で$lineの中身を分割しています。つまり、ここでは[1, 仁, 男, 100点]の中にある要素を順番に取り出して、tdタグの要素として挿入しています。
最終的にテーブルヘッダに沿った内容のデータが、HTML形式でブラウザ上に表示されるようになります。
// #4 ファイルを閉じる
fclose($f);
?>
最後にファイルをcloseして、すべての処理が完了となります。
まとめ
今回はfgetcsvを使い、csv形式のファイルの読み込みから表示までをサンプルコードを交えながら解説しました。
csvファイルに限らず、プログラムに外部からデータを取り込む、またはプログラムの内部に存在するデータをファイルに書き出す作業はよく発生するため、fopenからの流れを覚えておくと非常に便利です。
またfopen関数の構造はどの関数でも似ているため、応用が利きやすいです。とくにPHPのfopenはC言語やPythonのfopen関数によく似ているので、すぐに理解できるでしょう。