CSVとは、Comma Separated Value(カンマで区切られた値)の頭文字をとったものです。つまり、CSVファイルとは、値(数値やテキスト等)をカンマで区切って書いたテキストファイルのことを指しています。
CSV ファイルをダブルクリックすると、自動的に表計算ソフト(Excel等)が起動し、カンマは見えず、表計算ソフト(Excel等)のデータと見た目は変わりありません。また、CSVファイルはテキストファイルなので、PCの機種の違いやアプリケーションの違いが(ほとんど)ありません。
このことにより、異なるアプリケーション間でデータを受け渡しすることが可能になります。
アップロードされたCSVファイルを利用するためには、カンマで区切られたそれぞれのデータを切り離して取得する必要があります。
PHPの関数の中には、いとも簡単にCSVファイルをそのままデータとして活用することができる関数が用意されています。
それではまず、ファイル送信フォームを作成します。
ここで使用するファイル送信フォームは、前節の「テキストファイルのアップロード」で使用したフォームの実行対象スクリプトを、「reception.php」から「address.php」に変更したHTMLのページです。
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>送信ファイル</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="address.php">
<p>送信ファイル:<input type="file" name="userfile" size="40"> <input type="submit" value="送信" name="up"></p>
</form>
</body>
</html>
送信対象のCSVファイルを作成します。今回は、作成したCSVファイル「address.csv」を、ローカルディスク(C:)直下のtemplateディレクトリに配置します。
山田太郎,男,166-0003,東京都杉並区高円寺南1-111-11
山田花子,女,154-0017,東京都世田谷区世田谷2-2-22
山田二郎,男,150-0002,東京都渋谷区渋谷3-3-33
山田三郎,男,180-0001,東京都武蔵野市吉祥寺北町4-4-44
山田華子,女,542-0062,大阪府大阪市中央区上本町西5-5-5
前章のaction属性で指定した「address.php」ファイルを作成します。
<?php
$handle = fopen( $_FILES[ 'userfile' ][ 'tmp_name' ], "r" );
while( $data = fgetcsv( $handle, 1000, "," ) ) {
$name = $data[0];
$sex = $data[1];
$postcode = $data[2];
$address = $data[3];
echo "名前:$name<br>n";
echo "性別:$sex<br>n";
echo "郵便番号:$postcode<br>n";
echo "住所:$address<br>n";
echo "-----------------------------------------<br>n";
}
fclose( $handle );
?>
名前:山田太郎 性別:男 郵便番号:166-0003 住所:東京都杉並区高円寺南1-111-11 ----------------------------------------- 名前:山田花子 性別:女 郵便番号:154-0017 住所:東京都世田谷区世田谷2-2-22 ----------------------------------------- 名前:山田二郎 性別:男 郵便番号:150-0002 住所:東京都渋谷区渋谷3-3-33 ----------------------------------------- 名前:山田三郎 性別:男 郵便番号:180-0001 住所:東京都武蔵野市吉祥寺北町4-4-44 ----------------------------------------- 名前:山田華子 性別:女 郵便番号:542-0062 住所:大阪府大阪市中央区上本町西5-5-5 -----------------------------------------
上記スクリプトのfgetcsv()関数で取得したデータをカンマで切り離し、その結果を配列$dataに格納します。後は配列に格納されたデータを取り出せば、CSVファイル経由でアップロードされたデータを自由に使うことができます。
fgetcsv( resource handle [, int length [, string delimiter
[, string enclosure]]] );