Site icon Tips Note by TAM

Faker で大量のダミーデータを作り、JSON や CSV 形式で出力させるまで

テストなどで、大量のダミーデータの準備が必要な場合があります。たとえば、10,000件分のダミーの個人情報っぽいデータの準備とか……めんどくさそうですね。

ということで、PHP の Faker というライブラリを使って大量のダミーデータでも自動生成させ、JSON や CSV 形式にして吐き出すまでをやってみます。

Faker のインストール

Faker は PHP 5.3以降に対応した、ダミーデータ生成用のライブラリです。Laravel などのフレームワークにも導入されていたりする、けっこうメジャーなものです。

インストールは composer から一発で。( composer は PHP のパッケージマネージャですね)

$ composer require fzaninotto/faker

最初のサンプル

インストールできたら、まずは試しに以下のような PHP ファイルを作ってみます。

<?php
// faker-sample1.php
require_once 'vendor/autoload.php';

$faker = Faker\Factory::create();

for ($i = 0; $i < 5; $i++) {
    echo $faker->name, PHP_EOL;
}

Faker を呼び出して $faker->name の結果を5回表示させる、という簡単なサンプルになります。これを実行してみると、

$ php faker-sample1.php
Lucy McCullough
Dr. Chelsea Hudson
Mrs. Rosella Spinka DVM
Caesar Armstrong
Prof. Wade Rutherford

こんな感じで、5人分のダミーな人名が表示されました。
(結果は実行するたびにランダムに変わります)

日本語データにする

デフォルトでは得られるデータは英語なので、日本語にしてみます。さきほどのコード 5行目の Faker 生成の際に、ja_JP というオプションを指定すればOKです。

// 前述のコードの5行目にオプション指定
$faker = Faker\Factory::create('ja_JP');

このようにして実行すると、

$ php faker-sample2.php
田辺 裕樹
小泉 直子
井高 結衣
近藤 修平
加藤 美加子

日本語の人名のダミーデータが生成できました。

ちなみに仕組みとしては、Faker 内に多言語化ファイルが用意されており、その中に書かれた日本人の人名リストからランダムに選択されるようになっています。
https://github.com/fzaninotto/Faker/blob/master/src/Faker/Provider/ja_JP/Person.php

いろんな種類のデータを作ってみる

Faker はもちろん人名以外にも、さまざまな種類のデータを生成できます。
詳細はオフィシャルのドキュメントに詳しいのですが、今回は郵便番号・住所・電話番号・メールアドレス・生年月日、あとランダムな数字やテキストを生成させてみましょう。

<?php
// faker-sample3.php
require_once 'vendor/autoload.php';

$faker = Faker\Factory::create('ja_JP');

$data = [];

for ($i = 0; $i < 10; $i++) {
    $data[] = [
        'name'     => $faker->name,            // 名前
        'zip'      => $faker->postcode,        // 郵便番号
        'pref'     => $faker->prefecture,      // 都道府県
        'city'     => $faker->city,            // 市
        'address'  => $faker->streetAddress,   // 住所
        'phone'    => $faker->phoneNumber,     // 電話番号
        'email'    => $faker->safeEmail,       // メール
        'birthday' => $faker->dateTimeBetween('-80 years', '-20years')
                            ->format('Y-m-d'), // 生年月日 (20〜80年前の日付)
        'score'    => $faker->numberBetween(1, 100), // 1〜100の数字
        'text'     => $faker->realText(20),    // ダミーテキスト 20文字
    ];
}

// 出力
var_export($data);

実行するとこんな感じです。
かなりそれっぽい、でもダミーなデータが一発で吐き出されるようになりました。

$ php faker-sample3.php
array (
  0 =>
  array (
    'name' => '井上 さゆり',
    'zip' => '4043535',
    'pref' => '栃木県',
    'city' => '津田市',
    'address' => '山岸町吉田10-4-5',
    'phone' => '080-2454-2863',
    'email' => 'tanabe.taro@example.org',
    'birthday' => '1987-01-24',
    'score' => 74,
    'text' => 'ひとりともだんだろうとしまわって涙なみ。',
  ),
  1 =>
  array (
    'name' => '吉本 舞',
    'zip' => '2939306',
    'pref' => '青森県',
    'city' => '斉藤市',
(以下略)

なお、メールアドレスは $faker->email でも取得できるのですが、実在する可能性のあるアドレスになりますので、ここでは $faker->safeEmail を使いました。この場合ドメインが example.comexample.org などのメールアドレスとなり、取り回しが安全です。

JSON で出力させる

生成したデータを JSON形式で出力させてみます。
PHP でデータを JSONに変換するには json_encode() で一発ですね、ということで前述のコード末尾の出力部分 (var_export()) を、以下のように変更します。

echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), PHP_EOL;

すると出力結果はこんな感じ。

$ php faker-sample4.php
[
    {
        "name": "野村 淳",
        "zip": "4033002",
        "pref": "三重県",
        "city": "山本市",
        "address": "近藤町山口3-2-3",
        "phone": "090-9602-3145",
        "email": "naoko.suzuki@example.org",
        "birthday": "1969-05-06",
        "score": 39,
        "text": "わらは、そこらえて寄よせた大きくなって。"
    },
    {
        "name": "石田 あすか",
        "zip": "3202736",
        "pref": "埼玉県",
(以下略)

ばっちり JSONデータとなります。

CSV で出力させる

CSV形式での出力方法はいろいろあると思いますが、今回は league/csv を使ってみました。

league/csv を composer でインストールし、

$ composer require league/csv

さきほどと同様、末尾に以下の2行を記述すれば CSV で吐き出してくれるようになります。

$writer = League\Csv\Writer::createFromFileObject(new SplTempFileObject());
echo $writer->insertAll($data), PHP_EOL;

出力結果はこんな感じ。

$ php faker-sample5.php
"青田 晃",8203721,山口県,浜田市,大垣町井上3-6-8,090-5372-9051,nagisa.momoko@example.org,1984-03-31,82,っきよりらしいとこにこんなさいのかねて。
"藤本 結衣",5891438,奈良県,山岸市,佐々木町杉山5-7-3,090-2827-6045,uno.rika@example.org,1962-11-10,20,てしましたかって監督かんしんごのように。
"佐々木 直樹",1769320,埼玉県,西之園市,木村町大垣9-5-7,090-4173-8934,kana.nagisa@example.com,1979-11-30,51,砂糖かくひょうはもう腸はらじゅうがぼく。
"笹田 千代",5428184,福井県,鈴木市,杉山町松本5-1-5,080-8871-3555,suzuki.kana@example.com,1995-10-06,13,農業のうぎょうさっきりになりまえられ。
"村山 健一",6998762,島根県,工藤市,津田町桐山5-10-2,62-4550-4583,akira40@example.com,1980-07-16,72,っていました。それからもう一つの電燈で。

その他に生成できるデータ

Faker で生成できるデータの種類はたくさんあるのですが、いくつかピックアップすると、

dateTimeThisDecade()           // ここ10年のランダムな時刻 DateTime('2011-05-29 22:30:48')
hexcolor                       // 16進カラーコード '#fa3cc2'
ipv4                           // IPアドレス '109.133.32.252'
imageUrl(640, 480, 'cats')     // 猫の画像 'http://lorempixel.com/640/480/cats/'
randomElement(['男性', '女性']) // 配列を与えてその中からランダムに返す '女性'

などといったプロパティがあります。詳しくはオフィシャルのドキュメントをどうぞ。

というわけで

テスト用のデータ生成に便利な Faker, ぜひご活用ください。

なお、今回のサンプルコードは GitHub のこちらにも配置しております。
https://github.com/tipsnote/faker-sample