PHPでCSVファイルを読み込む

(2/2)
送られたファイル名は、変数 $_FILES[名前]['tmp_name'] に格納される。名前は、input type="file"に付けた名前である。
また、変数 $_FILES[名前]['tmp_name'] に、送られたファイルのサイズが格納されるので、この値が 0 だったら、ファイル指定が間違っていたとしてエラーを表示する。

0046:     if ($_FILES['file']['size'] == 0) {
0047:         echo "Error! - 指定したファイルが見あたりません";
0048:         exit(1);
0049:     }
0050:     $source_file = $_FILES["file"]["tmp_name"];      //アップされたCSVファイル

CSVファイルの読み込み

ファイルの操作は Google news の時と同様、関数  fopen  でオープンし、while ループを繰り返す。
すでに POST されたファイルをオープンするので  fopen  エラーは発生しないはずだが、念のためエラーチェックを行っている。ファイルから1行を読み込む際、関数  fopen  の代わりに、関数  fopen  を用いる。関数  fopen  は、
fgetcsv (fopen で戻るファイル番号, 最大読み込みバイト数, 区切り文字)

space
のように使う。戻り値は、区切り文字で区切られた部分文字列からなる配列である。ループ終了条件は、関数  fgets  が失敗(ファイル・エンド)するまでである。

0051:     if (($infp  = fopen($source_file, "r")) == FALSE) {
0052:         echo "Error! - サーバ・トラブルが発生しました";
0053:         exit(1);
0054:     }
0055:     echo "<table border=\"1\">\n";
0056:     while (($csv = fgetcsv($infp, 1000, $delimiter)) !== FALSE) {

表形式への変換

あとは簡単である。関数  fgets  で得られた配列(表の1行に相当)を foreach で読み込み、<td> タグで囲みながら表示する。
この際、関数  mb-convert-encoding  により、入力ファイルが Shift JIS, EUC-JP, UTF-8 のいずれであっても、自動的に出力エンコード(UTF-8)に変換し、文字化けが起きないようにしている。
foreach が終わったら、<tr> タグで囲む。
space
なお、このプログラムは、すべての行に同じ数の区切り文字が存在している――列が結合していることはない――ことを前提としている。
ただし、「デリミタの間にデータが存在しない場合、HTML で空欄をいれたい」という要望があったので、取り出した文字が空である場合、空白文字(&nbsp;)を出力するようにした。
space
このプログラムはインターネット上の CSV 形式ファイルに対しても、まったく同じ手順で表形式に変換することができる。Mozilla 系ブラウザであれば、冒頭のテキストボックスに CSV ファイルの URL を入れるだけで変換してくれる。

0055:     echo "<table border=\"1\">\n";
0056:     while (($csv = fgetcsv($infp, 1000, $delimiter)) !== FALSE) {
0057:         print "<tr>\n";
0058:         foreach ($csv as $key=>$val) {
0059:             if ($val == '')        $val ='&nbsp';  //デリミタ間にデータが存在しない場合は空白出力
0060:             $val = mb_convert_encoding($val, 'UTF-8', 'auto');  //コード変換
0061:             echo "<td>$val<td>\n";
0062:         }
0063:         echo "</tr>\n";
0064:     }
0065:     echo "</table>";

参考書籍

(この項おわり)
header