Excelなどで作成されたCSVファイルのデータを読み込みたい場合は、fgetcsv()関数を使うと便利です。CSVファイルの正体はテキストファイルなので、fgets()関数などで読み込んだ後、文字列関数などでデータをカンマで区切って処理することも可能です。しかし、fgetcsv()関数を使うと、読み込み処理とカンマによる分割を一度に行ってくれます。
fgetcsv()関数の第1引数には「fopen関数の返り値であるファイルハンドル」、第2引数には「1行分の長さ」をバイト単位で指定します。この値は実際の長さと同じである必要はないので、ある程度余裕を持った値を指定すればよいでしょう。
fgetcsv()関数の返り値は配列です。CSVファイルの1行分のデータがカンマで区切られ、各列のデータが別々のインデックスに格納されます。以降はこの配列を処理することによって、各列別にデータを取り扱うことができます。また、fgetcsv()関数はファイルが終端(EOF)に達するとFalseを返します。その返り値によって、全データが読み込まれたかどうかを判断できます。
CSVファイルに空行があった場合、配列のインデックス「0」にNULL値が代入されて返ります。そのような行を無視したい場合は、NULL値かどうかに応じた条件分岐を追加し、次のようなスクリプトとします。
while($filedata = fgetcsv($fp, 1024)){ if($filedata[0] != NULL){ $html .= ""; foreach($filedata as $data){ $html .= " "; } }" . $data . " "; } $html .= "
なお、「fgetcsv($fp, 1024, "*")」のように第3引数を指定すると、カンマ以外の任意の文字を区切り文字として処理させることもできます。
<?php header("Content-type: text/html; charset=utf-8"); if(!$fp = @fopen("data/FIFARank.csv", "r")){ echo "ファイルを開けませんでした!"; exit(); } $html = ""; while($filedata = fgetcsv($fp, 1024)){ $html .= "<tr>"; foreach($filedata as $data){ $html .= "<td>" . $data . "</td>"; } $html .= "</tr>"; } $html = mb_convert_encoding($html, "utf-8", "shift_jis"); fclose($fp); ?> <!DOCTYPE HTML> <html lang="ja-JP"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <table border="1"> <tr> <td>ランク</td><td>チーム</td><td>地域</td><td>ポイント</td> </tr> <?=$html?> </table> </body> </html>