【初心者向け】Laravel:CSVファイルインポートをやってみた!
こんにちは!システム開発部の福井です!
今回は、LaravelでGoodby CSVライブラリを使用したCSVファイルのインポートを行ってみましたので、ご紹介させていただきます!
※初めてのブログ投稿になりますので、手に汗握って書かせていただきます...!
ちなみに、今回はHomestead環境下に作成したLaravelプロジェクトで作業を行いました。
環境は以下の通りです。
・PHP 7.4.5
・Laravel 7.14.1
・MySQL 5.7
目次
・事前準備
・Goodby CSVライブラリのインストール
・CSVインポートメソッドの作成
・動作確認
・まとめ
・おまけ
事前準備
今回は、本の「タイトル」と「価格」だけを登録するシンプルなテーブルを用意しようと思います。
テーブル名 | books |
---|---|
カラム | id, title, price |
1 2 3 4 5 6 | Schema::create( 'books' , function (Blueprint $table ) { $table ->increments( 'id' ); $table ->string( 'title' ); $table ->integer( 'price' ); $table ->timestamps(); }); |
用意したviewはこちらです。
(はい、シンプルです!すみません!)
ルーティングとCSVインポート用メソッド、モデルを準備したら、次は Goodby CSVライブラリをインストールします。
Goodby CSVライブラリのインストール
以下のコマンドを実行して、Goodby CSVライブラリをインストールしてください。
1 | composer require goodby/csv |
完了まで待ちます。
インストールが完了したら、Goodby CSVのGitHubにあるREADMEに従い、該当のコントローラーに以下のuse宣言を追加します。
Goodby CSV GitHub
1 2 3 | use Goodby\CSV\Import\Standard\LexerConfig; use Goodby\CSV\Import\Standard\Lexer; use Goodby\CSV\Import\Standard\Interpreter; |
CSVインポートメソッドの作成
CSVインポート部分のコードは以下のように書きました。
DB保存処理の前に、Goodby CSVのconfig設定とCharset変換を行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public function importCsv(Request $request ) { // CSV ファイル保存 $tmpName = mt_rand(). "." . $request ->file( 'csv' )->guessExtension(); //TMPファイル名 $request ->file( 'csv' )->move(public_path(). "/csv/tmp" , $tmpName ); $tmpPath = public_path(). "/csv/tmp/" . $tmpName ; //Goodby CSVのconfig設定 $config = new LexerConfig(); $interpreter = new Interpreter(); $lexer = new Lexer( $config ); //CharsetをUTF-8に変換、CSVのヘッダー行を無視 $config ->setToCharset( "UTF-8" ); $config ->setFromCharset( "sjis-win" ); $config ->setIgnoreHeaderLine(true); $dataList = []; // 新規Observerとして、$dataList配列に値を代入 $interpreter ->addObserver( function ( array $row ) use (& $dataList ){ // 各列のデータを取得 $dataList [] = $row ; }); // CSVデータをパース $lexer ->parse( $tmpPath , $interpreter ); // TMPファイル削除 unlink( $tmpPath ); // 登録処理 $count = 0; foreach ( $dataList as $row ){ Book::insert([ 'title' => $row [0], 'price' => $row [1]]); $count ++; } return redirect()->action( 'ItemsController@book' )->with( 'flash_message' , $count . '冊の本を登録しました!' ); } |
動作確認
今回は以下の3行のデータをCSVで保存しようと思います。(音楽が好きです。。)
CSVファイル選択を行い、アップロードをクリックして...
無事、処理が通りリダイレクトした様子です。
DBを確認します。
CSVに書いたデータがDBに保存されている事が確認できました!
まとめ
無事、CSVに書き込んだ情報をDBに保存する事ができて良かったです。
作業前は少し構えていましたが、ライブラリのインストールから登録処理までは比較的短時間で行えるので、非常に便利だと感じました。
実際には、バリデーションチェックや例外処理などが必要ですが、大量のデータを登録したい時など、状況に合わせて使っていきたいと思います。
おまけ
■ CSVテンプレートファイルのダウンロード
以下のメソッドを追加する事で、CSVのテンプレートファイルをダウンロードする事ができました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public function downloadCsv(): object { // 出力データを用意 $csvHeader = [ "タイトル" , "価格" ]; // 出力データをカンマ区切りでセット $downloadData = implode( ',' , $csvHeader ); // Excel対応 $downloadData = mb_convert_encoding( $downloadData , "SJIS" , "UTF-8" ); // 一時的にcsvファイルを作成 if (! file_exists (storage_path( 'csv' ))) { $bool = mkdir (storage_path( 'csv' )); // ディレクトリ作成失敗時に例外を投げる if (! $bool ) { throw new \Exception( "ディレクトリを作成できませんでした。" ); } } $name = 'book.csv' ; $pathToFile = storage_path( 'csv/' . $name ); // CSVファイルを作成 if (! file_put_contents ( $pathToFile , $downloadData )) { throw new \Exception( "ファイルの書き込みに失敗しました。" ); } // ダウンロードレスポンス return response()->download( $pathToFile , $name )->deleteFileAfterSend(true); } |
■ Edit csv (VScodeプラグイン)
今回の作業を機に追加しました。VScode上でCSVをとても見やすくしてくれます。
最後に
私が所属するシステム開発のサービスサイト「SEKARAKU Lab(セカラク ラボ)」を開設しました。
ビヨンドは、サーバーの設計・構築から運用までをワンストップでお任せいただけますので、サーバーサイド開発でお困りの方はお気軽にお問い合わせください。
SEKARAKU Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
今回は以上となります!
最後まで読んでくださって、ありがとうございました!