PHPでcsvファイルを読み込みする【初心者向け】

プログラミング
PHPにあるfgetcsvがcsvデータを配列に変換できる関数であることを説明します。またfgetcsvの使い方だけではなく、fopenと併用してcsv形式のデータを処理する方法を、サンプルコードも交えて解説します。追加情報として、fopenにあるモードを切り替えることで「ファイルの読み込み」「ファイルの書き出し」の2つの処理を使い分ける方法について、説明を行います。
PHPでcsvファイルを読み込みする【初心者向け】

PHPを利用したWebサービスの中には、アップロードしたcsvのデータを読み込み、ブラウザ上に表示させるようなものがあります。
これはアップロードしたファイルをPHPの機能を使って読み込み、データベースに登録することで実現しています。

今回はこういったcsv形式のデータを処理するために必要なPHPの関数、fgetcsvについて解説します。

PHP fopenを使ってcsvファイル読み込み

1

外部ファイルからデータを読み込みするサービスは、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で指定できるモードの種類

2

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とは

3

PHPのfgetcsvとはfopen "r"モードにて読み込みしたファイルのデータ形式がcsvだった場合、データ構造を配列にして出力する関数です。
そのためcsvの読み込み処理を行う際には、かならず使用する関数になります。

fgetcsv関数の書き方は以下の通りです。

fgetcsv($handle)

$handleには、fopenによって作成されたデータストリームを指定します。データストリームとは上に挙げたサンプルコード内にある"$f"のことです。

PHPのfgetcsvによって取得できたcsvデータの多重配列は、for文やwhile文を利用して1行の配列を順番に取得することができます。

fgetcsvを使ってcsvファイルを配列に変換する

4

今回サンプルコードとして取り上げているサンプルコードの流れは以下の通りです。

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関数によく似ているので、すぐに理解できるでしょう。


この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


おすすめのコラム