【Laravel】Goodby CSVライブラリを使ってCSVファイルを読み込む

 こんにちわ、今日は部屋の掃除をして気持ちもすっきりのHashiです。さて、前回LaravelでCSVをダウンロードする方法を紹介しましたが、今回は逆にCSVのインポート(読み込み)に関しても備忘録を兼ねて紹介したいと思います。

 なお、Laravelとはなんぞやという方は下の記事を参照してください!

環境

 今回の環境は下記の通りとなります。

今回の環境

  • Laravel 5.5
  • MySQL 5.6.37

要点と環境

 それでは、実際にソースコードを書いていく前に、まず、今回の要点と環境を下記に簡単にまとめます。

  • CSVファイルはPOSTで受け渡す
  • CSVのデータには、行ごとに「名前」と「メールアドレス」が記載されている
  • CSVは「Goodby CSV」ライブラリを使用してパース
  • パースしたデータをDB(samplesテーブルと仮定)に保存
  • samplesテーブルには「name」と「email」フィールドが存在する

CSVのインポート(読み込み)

 では、実際に順を追って説明していきたいと思います。LaravelでCSVを読み込む方法はいくつかありますが、今回は「Goodby CSV」というライブラリを使って読み込んでいきたいと思います。

「Goodby CSV」ライブラリをインストール

 まず、今回は「Goodby CSV」ライブラリを使用するのでインストールします。

 composer.jsonファイルのrequireに下記のように追記します。


{
  ~
  "require": {
    ~
    "goodby/csv": "*"
  },
  ~
{

 上記を追記して保存したら、お決まりのアップデート。

composer update

Modelファイルを作成

 次に、Modelファイルを作成していきます。今回はsamplesというテーブルがあると仮定しているので下記コマンドで「Sample.php」というファイルを作成します。

php artisan make:model Sample

 ファイルはapp直下に作成されます。

app
 ├ Sample.php

Viewファイルを作成する

 次に、Viewにあたるファイルを作成していきます。今回は「sample.blade.php」というファイルを下記階層に作成します。

resources
 ├ views
  ├ sample.blade.php

 ソースコードとしては、ファイルを読み込むフォームを下記のような感じで用意します。(formヘルパー使用)

 ※下記コードはフォームの部分のみになるので、それ以外の箇所は適宜コーディングしてください。


{{ Form::open(['url' => url('/sample'), 'method' => 'POST', 'class' => '', 'files' => true]) }}

{{ Form::close() }}

Controllerファイルを作成する

 ModelとViewファイルを作成したので、あとはControllerにあたるファイルを作成していきます。今回は「SampleController.php」というファイルを下記階層に作成します。

app
 ├ Http
  ├ Controllers
   ├ SampleController.php

 ファイルを作成したら、Controller部分のソースを書いていきたいと思います。

Goodby CSVをインポートする

 まずは、冒頭でインストールした「Goodby CSV」ライブラリをインポートしていきます。


use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;

Sampleモデルをインポートする

 今回は、読み込んだCSVのデータをDBのsamplesテーブルに挿入するので、Sampleモデルをインポートします。(Sampleモデルとsamplesテーブルは紐づいています)

use App\Sample;

csvをインポートする

 これで、インポートできる環境が整ったのでCSVをインポートしていきます。下のソースが一応Controller部分(SampleController.php)の完成形のサンプルソースになります。本来であればバリデーションやエラーハンドリングをしなければなりませんが、そちらは別の機会に紹介するとして今回は省きます。



use App\Sample;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;

class SampleController extends Controller
{

  public function showImportCSV()
  {

     return view('sample');

  }

  public function importCSV(Request $request)
  {

     //postで受け取ったcsvファイルデータ
     $file = $request->file('file');

     //Goodby CSVのconfig設定
     $config = new LexerConfig();
     $interpreter = new Interpreter();
     $lexer = new Lexer($config);

     //CharsetをUTF-8に変換
     $config->setToCharset("UTF-8");
     $config->setFromCharset("sjis-win");

     $rows = array();

     $interpreter->addObserver(function(array $row) use (&$rows) {
         $rows[] = $row;
     });

     // CSVデータをパース
     $lexer->parse($file, $interpreter);

     $data = array();

     // CSVのデータを配列化
     foreach ($rows as $key => $value) {

        $arr = array();

        foreach ($value as $k => $v) {

            switch ($k) {

        	case 0:
        	$arr['name'] = $v;
        	break;

        	case 1:
        	$arr['email'] = $v;
        	break;

        	default:
        	break;
            }

        }

        $data[] = $arr;

    }

    // DBに一括保存
    Sample::insert($data);

    return redirect('/sample')->with('save_message', 'CSVのデータを読み込みました');

  }

}

 実際に、CSVをインポートしている箇所は、importCSV関数内になります。各コードにコメントアウトしているのでわかるかと思いますが、簡単に流れを説明すると下記のようになります。

  1. フォームデータからCSVファイルを受け取る
  2. Goodby CSVのconfig設定
  3. Goodby CSVライブラリでCSVデータをパース
  4. $data配列に多次元連想配列でデータを格納
  5. DBに保存
  6. リダイレクト

routing設定

 最後に、下記のようにルーティングを設定(routes/web.php)して完了になります。


Route::get('/sample', 'SampleController@showImportCSV');
Route::post('/sample', 'SampleController@importCSV');

まとめ

 ということで、今回はLaravel環境で「Goodby CSV」ライブラリを使ってCSVを読み込む方法を紹介しました。

 それでは、今回はここまで!また!

この記事のまとめ

  • Laravelで「Goodby CSV」ライブラリを使ってCSVをインポート(読み込み)する方法

お仕事のご相談・ご依頼
お気軽にお問い合わせください!

お仕事の依頼はこちら

著者プロフィール

Taka

東京、奄美大島を拠点にサーフィンとスノーボードが好きなフリーランスのWebクリエイターです。普段はプログラム書いたりデザインしたり映像作ったりしています。いろいろな人の話しを聞くのが好きなので、このブログを通して多くの人と繋がりが出来たら嬉しいです。noteとInstagramもやっているのでフォローしてくれたらありがたいです!

人気記事

  1. 非常にこの部分で困っていたので助かりました。
    ありがとうございます。

コメントを残す

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