バックエンド

【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というのはスプール(データを一時的に貯める場所)の略で

アオキ
Standard PHP Library の略でした、ご指摘ありがとうございます!

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/08/20 23:04:10時点 Amazon調べ-詳細)

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

1. 【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【techpit】

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

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

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

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

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

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

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

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

コメント

    • がろ
    • 2019年 7月 23日

    >> Splというのはスプール(データを一時的に貯める場所)の略で、
    https://www.php.net/manual/ja/book.spl.php
    Standard PHP Library の略だと思います

      • aoki_monpro
      • 2019年 7月 23日

      ご指摘ありがとうございます! 修正いたしました。

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

CAPTCHA


関連記事

  1. バックエンド

    新しいホテルを探すサービスの表示スピードを改善しました

    先日、新しいホテルや新築ホテルを探すサービスとして、『あたらし…

  2. バックエンド

    ワードプレスでクリック数を知りたい!というご相談をいただいたので対応方法をメモしておきます

    どーも、アオキです。最近ようやく赤ちゃんが寝返り返りしてくれて感極…

  3. バックエンド

    【Python】でWebアプリをがっつりやるならDjango一択な4つの理由【初心者向け】

    最近とある業界の『web予約サービス』をつくろうということになりまして…

  4. バックエンド

    ビットフライヤーからビットコインウォレットにビットコインキャッシュを送金してみる

    最近なにやらビットコインキャッシュ(BCH)周りがざわざわしております…

  5. バックエンド

    お薬手帳はブロックチェーンがあればいらなくなるんじゃない?

    普段生活していて、面倒くさいなって思うこと。それは、「お薬手帳」。…

Sponsored link

最近の記事

  1. バックエンド

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

    【WebGL】入門 わかりやすく【図解】してみた
  3. IoT関連

    【Arduino】ラジコンをつくってみた 〜今ドキのプログラミングの覚え方
  4. バックエンド

    【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【t…
  5. 学び・教育

    『ニュータイプの時代』〜リベラルアーツとテクノロジーの融合〜
PAGE TOP
//記事ページのみに構造化データを出力 //サムネイルを取得 //ここから構造化データの記述