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ファイルには空行や不正な形式が含まれる場合があります。$data
がfalse
やnull
でないかどうかを判定し、count()
などで適切なデータ長をチェックすることが重要です。
まとめ
PHPのfgetcsv()
を使えば、CSVファイルの読み込みからHTMLテーブルへの変換までを簡単に実装できます。ただし、文字コードの違いやセパレータの設定、セキュリティ対策を怠ると、思わぬトラブルにつながる可能性があります。実用的なスクリプトを書くためには、基礎的な使い方に加えて、こうした注意点を理解しておくことが大切です。