🐈

Larevelで/csvにアクセスしたらCSV入出力をするミニマムなアプリを作ってみる

2021/04/26に公開

はじめに

LaravelでCSVを使う案件にアサインされたので、とりあえずドキュメントを見ながらミニマムなものを作成してみました。

PHP: SplFileObject - Manual https://www.php.net/manual/ja/class.splfileobject.php

やってみたこと

  • Laravelプロジェクトを作成
$ composer create-project laravel/laravel laravel-csv
  • とりあえずLaravelが動くことを確認
$ cd laravel-csv/
$ php artisan serve

こんな画面が出るはず

  • テスト読み込み用のcsvを作成
$ mkdir csv
$ touch test.csv
test.csv
kato1,15,male
kato2,25,male
kato3,35,female
  • routeを追加
web.php
Route::get('/csv', function () {
    // 読み込み
    $read_file = "../csv/test.csv";
    $csv_array = [];
    $csv = new \SplFileObject($read_file);
    $csv->setFlags(
            \SplFileObject::READ_CSV |        // CSV 列として行を読み込む
            \SplFileObject::READ_AHEAD |      // 先読み/巻き戻しで読み出す
            \SplFileObject::SKIP_EMPTY |      // 空行は読み飛ばす
            \SplFileObject::DROP_NEW_LINE     // 行末の改行を読み飛ばす
    );
    foreach ($csv as $index => $row) {
        $csv_array[$index]['name']   = $row[0];
        $csv_array[$index]['age']    = $row[1];
        $csv_array[$index]['gender'] = $row[2];
    }
    print_r('<pre>');
    print_r($csv_array);
    print_r('</pre>');
    // 書き込み
    $save_file = '../csv/save.csv';
    $file = new \SplFileObject($save_file, 'w'); // ファイルが無ければ作成
    $file->setCsvControl(",");                   // カンマ区切り
    $data = [];
    $data[] = ['sato1', '15', 'male'];
    $data[] = ['sato2', '25', 'male'];
    $data[] = ['sato3', '35', 'female'];
    foreach ($data as $row) {
        $file->fputcsv($row);
    }
    print_r('<pre>');
    print_r($file);
    print_r('</pre>');
});
  • 実行してみる
$ php artisan serve

localhost:8000/csv にアクセスするとこんな画面表示になる

csvファイルが出力されている

$ cat csv/save.csv 
sato1,15,male
sato2,25,male
sato3,35,female

おわりに

とりあえずできました。あとはここから機能を作り込んで行きたいと思います。
僕と同じように初めて使う人の参考になれば嬉しいです。

参考

Discussion