
デスクワークの人なら誰もが知っていると思われる『CSVファイル』。
データが軽くてエクセルでも開け、プログラミングでも扱いやすいということで、
あらゆる業種で使われているファイル形式だと思います。
例えば数千件、数万件と大量のデータを扱おうとするとエクセルではなかなかしんどくなってくるので、
データベースの出番になります。
今回、CSVファイルをデータベースにインポートする機会があったので、
PHP(Laravel5.2)を使ってデータベースにCSVデータをインポートする方法をまとめました。
PHP(Laravel)でCSVインポートをする方法
『PHP』を使って『データベース』にCSVファイルをインポートする場合、
大きく2つの方法がります。
- ライブラリを使う
- PHP直書きで頑張る
1のライブラリ(便利ツール)は、Laravelの場合、
- Laravel-Excel
- fast-excel・・Laravel5.3以上
と2つのライブラリが用意されています。
PHP(Laravel)でCSVインポートする時のポイント
PHPでCSVインポートするポイントは大きく3つ。
- SplFileObjectクラスを使う
- 連想配列にまとめて連想配列で操作する
- 大量データならバルクインサートを検討する
PHPでCSVファイルを使うなら定番のクラスのようです。
手順的には、
- SplFileObjectでCSVファイルを取得して、
- 1行ずつ配列の箱に入れて、
- データベースにインポート
になります。
PHP(Laravel)でCSVインポートするコード
ちょっと加工していますがほぼ実際のコードを載せておきます。
- モデル・・データベース設定
2. マイグレーション・・データベースのテーブル構成
3. ルート・・クリックした後どの処理をするか
//laravel/Http/routes.php
<?php
Route::get('/', 'CSVimportsController@index')->name('csvimport_index');
Route::post('/import', 'CSVimportsController@import')->name('csvimport_import');
ルートもそのまんま。(Laravel5.3以上だとroute.phpの場所が変わるので注意)
4. ビュー・・見た目・フォーム
という箇所かと。CSVをインポートするなら必須と思われます。
続いて肝のコントローラー。
コメントでざっと解説してます。
5. コントローラー・・実際の処理
大量データをインポートする場合(バルクインサート)
変更点だけコメントしてます。
//laravel/Http/Controllers/CSVimportsController.php
public function import(Request $request)
{
CSVimport::truncate();
setlocale(LC_ALL, 'ja_JP.UTF-8');
$uploaded_file = $request->file('csv_file');
$file_path = $request->file('csv_file')->path($uploaded_file);
$file = new SplFileObject($file_path);
$file->setFlags(SplFileObject::READ_CSV);
//配列の箱を用意
$array = [];
$row_count = 1;
foreach ($file as $row)
{
if ($row === [null]) continue;
if ($row_count > 1)
{
$name = mb_convert_encoding($row[0], 'UTF-8', 'SJIS');
$reserved_date = mb_convert_encoding($row[1], 'UTF-8', 'SJIS');
$checkin_date = mb_convert_encoding($row[2], 'UTF-8', 'SJIS');
$total_price = mb_convert_encoding($row[3], 'UTF-8', 'SJIS');
$csvimport_array = [
'name' => $name,
'reserved_date' => $reserved_date,
'checkin_date' => $checkin_date,
'total_price' => $total_price
];
// つくった配列の箱($array)に追加
array_push($array, $csvimport_array);
// 数が多いと処理重すぎなのでバルクインサートに切り替える
// CSVimport::insert(array(
// 'name' => $name,
// 'reserved_date' => $reserved_date,
// 'checkin_date' => $checkin_date,
// 'total_price' => $total_price
// ));
}
$row_count++;
}
//追加した配列の数を数える
$array_count = count($array);
//もし配列の数が500未満なら
if ($array_count < 500){
//配列をまるっとインポート(バルクインサート)
CSVimport::insert($array);
} else {
//追加した配列が500以上なら、array_chunkで500ずつ分割する
$array_partial = array_chunk($array, 500); //配列分割
//分割した数を数えて
$array_partial_count = count($array_partial); //配列の数
//分割した数の分だけインポートを繰り替えす
for ($i = 0; $i <= $array_partial_count - 1; $i++){
CSVimport::insert($array_partial[$i]);
}
}
まとめ
PHP(Laravel)でCSVインポートを実装する過程でいろんな事をググりまして、
- SplFileObjectの使い方
- 連想配列の操作
- バルクインサートの方法
などを知ることができ、知識を整理することができました。
いろんな知識や技術を組み合わせる必要があるので結果的にすごく勉強になったなと思います。
転職を本気で考えている方必見
プログラミング未経験者でも安心のサポート体制をご用意しています。
特に受講者アンケートでは『サポート体制がしっかりしていて魅力的』、 『転職を保証していただいていることで安心』
という声が多数!!
まずは無料カウンセリングに申し込んでみてはいかがでしょうか?