ウェブ、ショウジン

PHPを使ってCSVデータを外部ファイルとして出力してみる

2010-6-13
Category
PHP

チュートリアルの感覚で以下の記事で紹介されている内容を、初めて見る関数の機能とかも調べながら実際にやってみた。(うまくいかなかったりして自分で書き換えている部分もある)
PHPでCSVデータ出力

  • 配列の形で用意したデータをCSV形式にして保存する
  • 配列の形で用意したデータをCSV形式にしてダウンロード

まず最初の「CSV形式にして保存する」やつからやってみる。

作業の流れと内容。

  • データを保存するためのCSVファイル(test.csv)を空で用意しておく
  • CSVデータを作成する
  • CSVファイルを追記モードで開く
  • CSVファイルをロック
  • CSVファイルを初期化して中身を空にする(既存の内容に追記していく場合は不要)
  • 作成したCSVデータをCSVファイルに書き込む
  • CSVファイルを閉じる

データを保存するためのCSVファイル(test.csv)を用意したら、CSVデータを作成したり、その内容をCSVファイルに書き込んだりするphpスクリプトを作成する。(csvtest.php)

csvtest.php

<?php
// CSVファイル名の設定
$csvdata = "test.csv";

// CSVデータの初期化
$csv = "";

// CSVデータの内容
// 配列$dataにデータを格納していく
$data[0] = array("月曜日", "Monday");
$data[1] = array("火曜日", "Tuesday");
$data[2] = array("水曜日", "Wednesday");
$data[3] = array("木曜日", "Thursday");
$data[4] = array("金曜日", "Friday");
$data[5] = array("土曜日", "Saturday");
$data[6] = array("日曜日", "Sunday");

// CSVデータの作成
// 配列$dataのkey[$key]と内容[$value]を取得してforeach文でループ処理
foreach($data as $key => $value){

    $csv .= $key . ","; // CSVデータにkey名と区切り文字カンマを追加
    $csv .= $value[0] . ","; // CSVデータに配列$dataの要素[0](曜日の日本語)と区切り文字カンマを追加
    $csv .= $value[1] . "\n"; // CSVデータに配列$dataの要素[1](曜日の英語)を追加(末尾なので改行も一緒に追加)

}

// CSVファイルを追記モードで開く
$fp = fopen($csvdata, 'ab');

// CSVファイルを排他ロックする
flock($fp, LOCK_EX);

// CSVファイルの中身を空にする
// 既存の内容に追記していく場合は不要
ftruncate($fp, 0);

// CSVデータ$csvの内容をファイルに書き込む
fwrite($fp, $csv);

// CSVファイルを閉じる
fclose($fp);

// 完了メッセージを出力する
echo("CSVデータの書き込みに成功しました!");

ブラウザでこのphpスクリプトファイルにアクセス。

CSVデータがCSVファイルに無事に書き込まれるとブラウザに「CSVデータの書き込みに成功しました!」と表示される。test.csvを開いてみれば、実際にデータが書き込まれていることを確認することが出来る。

test.csvのパーミッションが適切に設定されていないとPermission deniedでデータをファイルに書き込めない。この場合はパーミッションの設定を書き込み可能に設定すること。

この例では、作成したCSVデータをサーバ上でCSVファイルに保存した。

つぎは、サーバ上に保存ではなく、このCSVデータの内容をそのままCSVファイルとしてローカルにダウンロードする場合のスクリプト。

csvtest2.php

<?php
// CSVファイル名の設定
$csvdata = "test.csv";

// CSVデータの初期化
$csv = "";

// CSVファイルに書き出すCSVデータの内容
// 配列$dataにデータを格納していく
$data[0] = array("月曜日", "Monday");
$data[1] = array("火曜日", "Tuesday");
$data[2] = array("水曜日", "Wednesday");
$data[3] = array("木曜日", "Thursday");
$data[4] = array("金曜日", "Friday");
$data[5] = array("土曜日", "Saturday");
$data[6] = array("日曜日", "Sunday");

// CSVデータの作成
// 配列$dataのkey[$key]と内容[$value]を取得してforeach文でループ処理
foreach($data as $key => $value){

    $csv .= $key . ","; // CSVデータにkey名と区切り文字カンマを追加
    $csv .= $value[0] . ","; // CSVデータに配列$dataの要素[0](曜日の日本語)と区切り文字カンマを追加
    $csv .= $value[1] . "\n"; // CSVデータに配列$dataの要素[1](曜日の英語)を追加(末尾なので改行も一緒に追加)

}

// MIMEタイプを設定する
header("Content-Type: application/octet-stream");

// ダウンロードする際にファイル名を表示する
header("Content-Disposition: attachment; filename=$csvdata");

// CSVデータを出力する
echo($csv);

ブラウザでこのcsvtest2.phpにアクセスしてみるとtest.csvを保存するかどうするかの確認ウィンドウが表示されるので、ここで「ファイルを保存」を実行。ローカルに保存されたこのファイルの内容を確認してみる。

ピクチャ 6

自宅のOSX環境にはMicrosoftのExelは入っていないので、Googleドキュメントでスプレッドシートとして読み込んで、その内容を確認してみる。

ピクチャ 7

CSVデータとして内容を無事に確認できた。

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿