【オンラインRPG】転生したらビヨンドのインターンだった件

【オンラインRPG】転生したらビヨンドのインターンだった件

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【圧倒的 低コスト】Oracle Cloud 構築・運用保守・監視サービス

【圧倒的 低コスト】Oracle Cloud 構築・運用保守・監視サービス

【WordPress専用】高速 クラウド / サーバー『WebSpeed』

【WordPress専用】高速 クラウド / サーバー『WebSpeed』

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【SNSアプリ開発】LINE カスタムアプリ開発サービス

【SNSアプリ開発】LINE カスタムアプリ開発サービス

【ECアプリ開発】Shopify カスタムアプリ開発サービス

【ECアプリ開発】Shopify カスタムアプリ開発サービス

【音声アプリ開発】Twilio カスタムアプリ開発サービス

【音声アプリ開発】Twilio カスタムアプリ開発サービス

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【取材記事】サーバーサイド・バックエンドエンジニアを募集中

【取材記事】サーバーサイド・バックエンドエンジニアを募集中

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【初心者向け】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
【カラム定義】

        Schema::create('books', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->integer('price');
            $table->timestamps();
        });

用意したviewはこちらです。
view画像
(はい、シンプルです!すみません!)

ルーティングとCSVインポート用メソッド、モデルを準備したら、次は Goodby CSVライブラリをインストールします。

Goodby CSVライブラリのインストール

以下のコマンドを実行して、Goodby CSVライブラリをインストールしてください。

composer require goodby/csv

完了まで待ちます。
ライブラリインストール

インストールが完了したら、Goodby CSVのGitHubにあるREADMEに従い、該当のコントローラーに以下のuse宣言を追加します。
Goodby CSV GitHub

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変換を行っています。

    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('[email protected]')->with('flash_message', $count . '冊の本を登録しました!');
    }

動作確認

今回は以下の3行のデータをCSVで保存しようと思います。(音楽が好きです。。)
CSV画像

CSVファイル選択を行い、アップロードをクリックして...
view画像
無事、処理が通りリダイレクトした様子です。
DBを確認します。
DB画像

CSVに書いたデータがDBに保存されている事が確認できました!

まとめ

無事、CSVに書き込んだ情報をDBに保存する事ができて良かったです。
作業前は少し構えていましたが、ライブラリのインストールから登録処理までは比較的短時間で行えるので、非常に便利だと感じました。
実際には、バリデーションチェックや例外処理などが必要ですが、大量のデータを登録したい時など、状況に合わせて使っていきたいと思います。

おまけ

■ CSVテンプレートファイルのダウンロード

以下のメソッドを追加する事で、CSVのテンプレートファイルをダウンロードする事ができました。

    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をとても見やすくしてくれます。
Edit csv

Edit csv Marketplace

最後に

私が所属するシステム開発のサービスサイト「SEKARAKU Lab(セカラク ラボ)」を開設しました。
ビヨンドは、サーバーの設計・構築から運用までをワンストップでお任せいただけますので、サーバーサイド開発でお困りの方はお気軽にお問い合わせください。
SEKARAKU Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

今回は以上となります!
最後まで読んでくださって、ありがとうございました!

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
12,873
facebook twitter はてなブックマーク
【オンラインRPG】転生したらビヨンドのインターンだった件【プレイ無料】

【オンラインRPG】転生したらビヨンドのインターンだった件【プレイ無料】

この記事をかいた人

About the author

福井 浩人

2020年6月にビヨンドに入社。システム開発部 (横浜オフィス) にて勤務。
業務ではPHPを中心に、ゲームAPIやWebシステムの開発、Shopifyプライベートアプリの開発を担当。
洋楽を主として音楽全般が好きで趣味でギターを弾いている。好きなTV番組は、「探偵!ナイトスクープ」「出没!アド街ック天国」。