概要
簡単シリーズ2段目*1 。
PHPでCSVを読込む方法を簡単にメモ*2 。
読込みフォームを作る
まずはフォームを用意します。
ここでの注意点はFormタグのenctype属性に”multipart/form-data”の指定を忘れないこと。僕はよく忘れます。
後は普通に<input type=”file” />と<input type=”submit” />を用意してあげるだけ。
以下サンプル
<form enctype="multipart/form-data" method="post" > <table class="form"> <tr> <td class="title">CSVファイルを指定してください</td> <td class="contents"><input type="file" name="csvfile" size="50" value="" /></td> </tr> <tr> <td class="button" colspan="2"> <input type="submit" name="submit" value="CSVファイル読込み" /> </td> </tr> </table> </form>
POSTしたファイルを読み込む
POSTされたファイル情報は定義済み変数の$_FILESに保存されます。
今回はファイルの中身を読み込むだけなので、$_FILES[‘%<input type=”file” />のname属性%’][‘tmp_name’]だけ使います。
処理の流れは次のようになります。
- ファイルを開く(fopen)
- CSVファイルを配列に入れる(fgetcsv)
- ついでに文字コード変換(mb_convert_variables)
こんな感じ。最後の文字コード変換については、エクセルから吐き出したCSVファイルはSJIS(SJIS-winだっけ?)なので、webで使う場合にはたいてい文字コード変換が必要になるだろうということで念のため。僕もすぐに忘れそうだし。
ソース見てもらったほうが早いと思うので、どうぞ。
$tmp = fopen($_FILES['usefile']['tmp_name'], "r"); while ($csv[] = fgetcsv($tmp, "1024")) {} // 配列 $csv の文字コードをSJIS-winからUTF-8に変換 mb_convert_variables("UTF-8", "SJIS-win", $csv);
fopen()でファイルを開いて$tmpに代入、
fgetcsvで$tmpを配列に展開するんだけど、fgetcsvするとポインタが勝手に進んでくれて、しかも最後まで行くとfalseを返してくれるので、whileでまわすだけでOK。$csvに代入していく。
最後にmb_convert_variables()で配列の文字コードを丸ごとSJIS-winからUTF-8に変換します。
たったこれだけです。簡単ですね。
ちゃんと検証して書いていないので、もし間違いや表現に誤りがあればご指摘いただくと有り難いです。質問などありましたらお気軽にコメントください。ちゃんとした質問ならちゃんとお応えしたいと思います。
ご清聴ありがとうございました。
全然関係ないんですが、SyntaxHighlighterでインデントを表示するのってどうすればいいんでしょう…
タブはもちろん駄目そうですが、スペースでも駄目なんですよね。
他所様のところではインデントちゃんとできているのを見かけるのですが、ご存知の方がいらっしゃいましたら教えてくださいませm_ _m