PHPでCSVデータを出力する方法

【この記事の所要時間 : 約 5 分

ちょっとPHPでCSVデータの出力を行う必要があったので、おさらいながら備忘録。ファイル名をつけてデータをCSV形式に書き出して保存する方法というので、以下のやり方はまずはベーシックな方法。
PHPでCSVデータ出力

<?php

// CSVファイル名の設定
$csv_file = “test.csv”;

// CSVデータの初期化
$csv_data = “”;

// CSVに書き出すデータ
$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データの作成
foreach($data as $key => $value ){

$csv_data .= $key. “,”;
$csv_data .= $value[0]. “,”;
$csv_data .= $value[1];

if(count($data) !== intval($key)+1){

$csv_data .= “\n”;

}
}

// ファイルを追記モードで開く
$fp = fopen($csv_file, ‘ab’);

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

// ファイルの中身を空にする
ftruncate($fp, 0);

// データをファイルに書き込む
fwrite($fp, $csv_data);

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

// 完了メッセージ
echo(“Created CSV Data!”);
?>

で普通というか、一般的には、上記のように自分でデータを作るのではなく、データベースからデータを引っ張ってきて、そのデータをCSVデータとして出力するというケースが多い。
そういうケースでは、詳細はケースによって違うかもしれないが、ベースとなるのは以下のような処理である。DBから取得した結果セット($rs)を、フェッチモード「DB_FETCHMODE_ASSOC」によって行フェッチする。こうすると、結果セットから行を取得し、結果ポインタを次の行へ次の行へと移動させることができる。 行が有効な場合、連想配列が返って来て、最後の行の場合は NULLが返って来るので、そこでwhile文が終了となる。
フェッチモード「DB_FETCHMODE_ASSOC」を使うと、結果セットから取得した行は、連想配列となっている。行の中の各カラムは、arr[‘ColName’]でアクセスすることができる。

// SQL
$sql = "select * from HOGEHOGE";
// DBからデータ取得
$rs = $db->query($sql);
while($row = $rs->fetchRow(DB_FETCHMODE_ASSOC))
{ 
$csv_data[] = implode(‘,’, $row) . "\r\n";
}
// 連想配列を連結
$csv_data=join("\n",$csv_data);
// 文字化け対策にSJISへエンコード
$csv_data = mb_convert_encoding($csv_data, "SJIS", "EUC-JP");

あと注意しておきたいのは、CSVデータは、カンマ区切りのデータなので、連想配列をそのまま fwrite でファイルに書き込むと失敗する。(たしか、ファイルには、「Array」としか書き込まれなかったはず。)
join を使って連想配列を連結してやらなければならない。
それ以外は、CSVデータをエクセルで開ける場合は、文字コードをSJISにしておかないと文字化けするので、エンコードしておいてあげる。こんなもんかな。
より詳しく知りたい方はこちらへ

プログラミングPHP 第3版
プログラミングPHP 第3版

posted with amazlet at 15.11.19
Kevin Tatroe Peter MacIntyre Rasmus Lerdorf
オライリージャパン
売り上げランキング: 44,636
スポンサーリンク
レクタングル(大)広告
  • このエントリーをはてなブックマークに追加
スポンサーリンク
レクタングル(大)広告

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です