はじめに
「CSVなんて、エクセルで作ればいいじゃないか」と思われるかもしれません。
確かにエクセルでも作れますが、今回作りたいものは
・必要なレコードの数が膨大(10万件など)
・それぞれの値に、完全にランダムな値をいれたい
・ファイルは数種類、多数作りたい
これらの要件を、エクセルで実現するには時間がかかってしまいます。
ということで、今回はPHPでコードを書き、CSVを量産できる体制を作ることにしました。
CSVファイルの作り方
まずはCSVファイルの作り方を説明します。
例えば次のようなシンプルなcsvを作りたかった場合。

結論から書くと、このようになります。
<?php
$record = array();
$name = '太郎';
$age = 20;
$BloodType = 'AB';
$record = array(
'name' => $name,
'age' => $age,
'blood-type' => $BloodType,
);
function putCsv($data) {
$FileName = 'sample.csv';
$res = fopen($FileName, 'w');
if ($res === FALSE) {
throw new Exception('ファイルの書き込みに失敗しました。');
}
$header = ["名前", "年齢", "血液型",];
fputcsv($res, $header);
foreach($data as $dataInfo) {
fputcsv($res, $dataInfo);
}
fclose($res);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
header('Content-Length: ' . filesize($csvFileName));
header('Content-Transfer-Encoding: binary');
readfile($csvFileName);
}
putCsv($record);
それぞれ順番に解説していきます。
最初に、レコードに入れたい要素を配列で準備しておきます。
$record = array();
$name = '太郎';
$age = 20;
$BloodType = 'AB';
$record = array(
'name' => $name,
'age' => $age,
'blood-type' => $BloodType,
);
次の部分では、CSVを出力するための関数を作っています。
function putCsv($data) {
//CSV形式で情報をファイルに出力のための準備
$csvFileName = '/tmp/' . time() . rand() . '.csv';
$fileName = time() . rand() . '.csv';
$res = fopen($csvFileName, 'w');
if ($res === FALSE) {
throw new Exception('ファイルの書き込みに失敗しました。');
}
// 項目名先に出力
$header = ["名前", "年齢", "血液型",];
fputcsv($res, $header);
// ループしながら出力
foreach($data as $dataInfo) {
// ファイルに書き出しをする
fputcsv($res, $dataInfo);
}
// ファイルを閉じる
fclose($res);
ちなみにそれぞれ次のような役割を持ちます。
・fopen(‘開きたいファイル名, 'w'); → ファイルを開き、書き込む
・fputcsv(‘編集したいファイル名’, ‘見出し’); → 配列の値をcsv形式でファイルに書き込む
・fclose(‘ファイル名’); → 開いたファイルを閉じる
次に、作成したファイルをダウンロードします。
// ダウンロード開始
// ファイルタイプ(csv)
header('Content-Type: application/octet-stream');
// ファイル名
header('Content-Disposition: attachment; filename=' . $fileName);
// ファイルのサイズ ダウンロードの進捗状況が表示
header('Content-Length: ' . filesize($csvFileName));
header('Content-Transfer-Encoding: binary');
// ファイルを出力する
readfile($csvFileName);
}
最後に、用意しておいた配列を渡して関数を呼び出せば完了です。
putCsv($record_list);
サーバを立ち上げ、ローカルでファイルを開くと、CSVがダウンロードされます。

実践編
これを応用して今回必要となるCSVを作りたいと思います。
<?php
$record_list = array();
for($i=0;$i<100000;$i++) { //レコード10万件分ループさせる
$id = rand(1, 99999999); //乱数を生成
$hash = array('A型', 'B型', 'O型','AB型'); //設定した選択肢からランダムに選ばれる
$key = array_rand($hash);
$BloodType = $hash[$key];
$BirthDate = rand(1950, 2000) . '/' . rand(1, 12) . '/' . rand(1, 30); //ランダムな日付
$record = array(
'id' => $id,
'blood-type' => $BloodType,
'birth-date' => $BirthDate,
);
$record_list[] = $record;
}
function putCsv($data) {
$csvFileName = '/tmp/' . time() . rand() . '.csv';
$fileName = time() . rand() . '.csv';
$res = fopen($csvFileName, 'w');
if ($res === FALSE) {
throw new Exception('ファイルの書き込みに失敗しました。');
}
$header = ["id", "血液型", "生年月日",];
fputcsv($res, $header);
foreach($data as $dataInfo) {
fputcsv($res, $dataInfo);
}
fclose($res);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
header('Content-Length: ' . filesize($csvFileName));
header('Content-Transfer-Encoding: binary');
readfile($csvFileName);
}
putCsv($record_list);
以下のCSVを出力することができました。

配列に入れる段階を調整すればさらにカスタマイズできますし、いくつでも欲しい形式のCSVファイルを取得できるようになりました。
まとめ
いかがだったでしょうか。
今回はphpを使ったcsvファイルの扱い方を解説しました。
ぜひ参考にしていただけますと幸いです。