目次

    はじめに

    「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ファイルの扱い方を解説しました。
    ぜひ参考にしていただけますと幸いです。




    PREV
    2022.09.11
    ブートストラップ グリッドの使用
    NEXT
    2022.09.12
    ミュラー・リヤー錯視とWEBサイト