Laravel

【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】

デスクワークの人なら誰もが知っていると思われる『CSVファイル』

データが軽くてエクセルでも開け、プログラミングでも扱いやすいということで、

あらゆる業種で使われているファイル形式じゃないかなと思います。

エクセルの関数を使えば簡単に計算もできるんですが、

例えば数千件、数万件と大量のデータを扱おうとするとエクセルではなかなかしんどくなってくるので、

データベースの出番になります。

今回、CSVファイルをデータベースにインポートする機会があったので、

『PHP(laravel5.2)』を使って『データベース(mysql)』にCSVデータをインポートする方法をまとめてみました。

Sponsored link

PHP(laravel)でCSVインポートをする方法

『PHP』を使って『データベース』にCSVファイルをインポートする場合、

大きく2つの方法があるのかなと思います。

  1. ライブラリを使う
  2. PHP直書きで頑張る

1のライブラリ(便利ツール)は、laravelの場合、

  • Laravel-Excel
  • fast-excel・・laravel5.3以上

と2つのライブラリが用意されています。

今回は『laravel5.2』で実施する必要があったため、

『fast-excel』は対象から外れ、

『Laravel-Excel』を試してみたのですがうまく動かず・・

ということで、2番の『PHP直書き』で頑張ることにしました。

『PHP CSV インポート』的なキーワードでググりにググって、

時にはメンターの方にもサポートいただきつつ、

無事CSVインポートできるようになったのでまとめてみます。

PHP(laravel)でCSVインポートする時のポイント

PHPでCSVインポートするポイントは大きく3つかなと思います。

  1. SplFileObjectクラスを使う
  2. 連想配列にまとめて連想配列で操作する
  3. 大量データならバルクインサートを検討する

Splというのはスプール(データを一時的に貯める場所)の略で、

PHPでCSVファイルを使うなら定番のクラスのようです。

手順的には、

  1. SplFileObjectでCSVファイルを取得して、
  2. 1行ずつ配列の箱に入れて、
  3. データベースにインポート

になります。

もし配列やクラスがピンとこない場合はこれらの記事も参考にしてみてください。

PHP(laravel)でCSVインポートする場合のファイル

今回は、こんなデータを想定しています。

横の列に、名前と日付と金額があって、
縦の行にそれぞれのデータが入っていると。

適当に4件書いてますが、実際には数千件〜数万件のデータ量になります。

今回は『laravel』で実施した関係で、5つのファイルを作ることになりました。

  1. モデル・・データベース設定
  2. マイグレーション・・データベースのテーブル構成
  3. ルート・・クリックした後どの処理をするか
  4. ビュー・・見た目・フォーム
  5. コントローラー・・実際の処理

本来は、コントローラーに処理を書きすぎるとファイルが大きくなりすぎるので、

(ファットコントローラーと呼ばれています)

サービスというフォルダを作ってそこにファイルを作った方がよいようです。

(サービスプロバイダやDIといった機能もいずれ記事にする予定です)

Sponsored link

PHP(laravel)でCSVインポートするコード

ちょっと加工していますがほぼ実際のコードを載せておきます。

  1. モデル・・データベース設定

CSVインポートする時に必ず必要な要素は protected $fillable で指定しておきます。

2. マイグレーション・・データベースのテーブル構成

マイグレーションはそのまんまです。

3. ルート・・クリックした後どの処理をするか

ルートもそのまんま。(laravel5.3以上だとroute.phpの場所が変わるので注意)

4. ビュー・・見た目・フォーム

ポイントは、formの中の

という箇所かと。CSVをインポートするなら必須と思われます。

続いて肝のコントローラー。

コメントでざっと解説してます。

5. コントローラー・・実際の処理

という流れです。

アオキ
さらっと書いてますが完成するまでにそれなりに時間かかってます(汗

このコードで無事CSVインポートできたのですが、一つ問題が・・

2000行くらいのCSVファイルをインポートしようとした時に、

タイムアウトでエラーが発生してしまったのです。

原因は、1件ずつインポートしていた事

その事をメンターに相談してみると、

メンター
基本的に、大量データを書き込む場合は、一件一件INSERTするのは効率悪すぎるのでやめたほうがいいです。
メンター
500件とか1000件とかまとまった単位でBULK INSERTしてみてください!
アオキ
バルクインサートですか・・

聞いたことはあったけれど実装するのは初。

これまたいろいろググって完成しました。

Sponsored link

大量データをインポートする場合(バルクインサート)

変更点だけコメントしてます。

という流れになっています。

アオキ
いやね、さらっと書いてるけど結構時間かかったんですって。
Sponsored link

さいごに

PHP(laravel)でCSVインポートを実装する過程でいろんな事をググりまして、

  • SplFileObjectの使い方
  • 連想配列の操作
  • バルクインサートの方法

などを知ることができ、知識を整理することができました。

いろんな知識や技術を組み合わせる必要があるので結果的にすごく勉強になったなと思います。

アオキ
この記事が何かしらお役にたちますように。
created by Rinker
¥3,800 (2019/06/18 19:53:49時点 Amazon調べ-詳細)

『PHP(Laravel)』ではこんな記事も読まれています。

1. 【PHP】【laravel】CSVエクスポートの方法〜5つのポイント〜

2. 【PHP】オブジェクトと連想配列の違いについて調べてみた【初心者向け】

3. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】

4. 【PHP】【図解】クラスと抽象クラスとインターフェースとトレイトとDIをまとめてみた【初心者向け】

5. 【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】

6. 【PHP】ホームページに天気予報を表示させる方法【Webスクレイピング】【初心者向け】

7. 【Laravel5.5】Webアプリケーションを作るためのゆるめの環境構築編【Node.js】【npm】【Vue.js】【初心者向け】

8. 【PHP】2次元(多次元)配列でデータ取得したいならarray_columnがめっさ便利

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


Sponsored link

関連記事

  1. Laravel

    【Vue.js/Laravel】Webアプリ実践記 37歳おっさんが独学でVue.js+Larave…

    webアプリ実践記 0日目~10日目webアプリ実践記 11…

  2. Laravel

    【laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfak…

    『PHPの現場』というポッドキャストの放送で、ひときわ印象に残…

  3. Laravel

    【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【用語集も兼ねて】【初…

    ウェブ職人のためのPHPフレームワークといえばやっぱり『Larav…

  4. PHP

    【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】

    ググって見ても配列のわかりやすい記事があまりなかったので、…

  5. Laravel

    【Django】【Laravel】【RubyOnRails】を比較してみた【初心者向け】【体験談】

    さらに開発力を高めるべく、先日とあるサロンに入会しまして、…

  6. Laravel

    【Vue.js/Laravel】Webアプリ実践記 37歳おっさんが独学でVue.js+Larave…

    webアプリ実践記 0日目~10日目webアプリ実践記 11…

Sponsored link

最近の記事

Sponsored link
  1. クリエイティブコーディング

    プログラミングと三角関数〜小学生でもすんなりわかる三角関数を目指して
  2. HTML/CSS

    【厳選8冊】ホームページを作れるようになるためのおすすめ本【初心者向け】
  3. 検索システム

    【検索システム】をつくってみた【実際にログインしてさわれます】
  4. 検索システム

    バリアフリーなホテル のページをオープンしました。
  5. 物理学

    物理とプログラミングの関係〜力学のはじめのいっぽ
PAGE TOP