【PHP】CSVファイルを読み込んでHTMLテーブルに変換する方法|fgetcsvの使い方と注意点

【PHP】CSVファイルを読み込んでHTMLテーブルに変換する方法|fgetcsvの使い方と注意点 PHP

CSVファイルを読み込んで、HTMLのテーブルとして表示したい場面は多くあります。PHPにはCSV処理に便利な関数fgetcsv()が用意されており、簡単にデータを扱うことが可能です。本記事では、実用的なコードとともに、fgetcsv()の基本的な使い方や注意点を解説します。

fgetcsv()の基本的な使い方

fgetcsv()は、CSVファイルの1行を配列として取得する関数です。最も基本的な使い方は以下のとおりです。

<?php
$handle = fopen('data.csv', 'r');
while (($data = fgetcsv($handle)) !== false) {
    print_r($data);
}
fclose($handle);
?>

このコードでは、data.csvというファイルを読み込み、1行ずつ配列として取得しています。各要素はカンマで区切られたセルに対応しており、ループで全行を順番に処理することができます。

HTMLテーブルに変換して表示する方法

CSVデータをHTMLテーブルとして出力するには、<table>タグと組み合わせて以下のように実装できます。

<?php
$handle = fopen('data.csv', 'r');
if ($handle !== false) {
    echo '<table border="1">';
    while (($data = fgetcsv($handle)) !== false) {
        echo '<tr>';
        foreach ($data as $cell) {
            echo '<td>' . htmlspecialchars($cell, ENT_QUOTES, 'UTF-8') . '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
    fclose($handle);
} else {
    echo 'CSVファイルを開けませんでした。';
}
?>

このスクリプトでは、1行ごとに<tr>を生成し、セルごとに<td>タグで囲っています。また、htmlspecialchars()を使うことで、表示上のセキュリティ(XSS対策)も考慮しています。

ヘッダー行をthタグで表示する場合

CSVの1行目が見出し(ヘッダー)の場合、<th>タグで表示するとより視認性の高いテーブルになります。以下はその実装例です。

<?php
$handle = fopen('data.csv', 'r');
if ($handle !== false) {
    echo '<table border="1">';
    $is_header = true;
    while (($data = fgetcsv($handle)) !== false) {
        echo '<tr>';
        foreach ($data as $cell) {
            $tag = $is_header ? 'th' : 'td';
            echo "<$tag>" . htmlspecialchars($cell, ENT_QUOTES, 'UTF-8') . "</$tag>";
        }
        echo '</tr>';
        $is_header = false;
    }
    echo '</table>';
    fclose($handle);
}
?>

このように、最初の行だけ<th>タグで処理し、2行目以降は通常通り<td>に切り替えることで、見出し付きのテーブルが完成します。

fgetcsvを使う上での注意点

文字コードに注意(特にExcelで作ったCSV)

日本語が含まれるCSVファイルでは、文字化けが発生することがあります。特にExcelで作成されたCSVはShift_JISで保存されることが多いため、mb_convert_encoding()でUTF-8に変換してから処理するとよいでしょう。

$data = array_map(function($v) {
    return mb_convert_encoding($v, 'UTF-8', 'SJIS-win');
}, $data);

セパレータがカンマ以外の場合もある

CSV形式にはカンマ以外にタブ(TSV)やセミコロンで区切られる形式もあります。fgetcsv()はセパレータを指定可能なので、必要に応じて第2引数を設定しましょう。

$data = fgetcsv($handle, 1000, "\t"); // タブ区切り

空行や不正なデータのチェック

CSVファイルには空行や不正な形式が含まれる場合があります。$datafalsenullでないかどうかを判定し、count()などで適切なデータ長をチェックすることが重要です。

まとめ

PHPのfgetcsv()を使えば、CSVファイルの読み込みからHTMLテーブルへの変換までを簡単に実装できます。ただし、文字コードの違いやセパレータの設定、セキュリティ対策を怠ると、思わぬトラブルにつながる可能性があります。実用的なスクリプトを書くためには、基礎的な使い方に加えて、こうした注意点を理解しておくことが大切です。