【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始!

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

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

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

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

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

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

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

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

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【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('ItemsController@book')->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
15,705
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始いたします!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始いたします!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

福井 浩人

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