こんにちわ、今日は部屋の掃除をして気持ちもすっきりのHashiです。さて、前回LaravelでCSVをダウンロードする方法を紹介しましたが、今回は逆にCSVのインポート(読み込み)に関しても備忘録を兼ねて紹介したいと思います。
なお、Laravelとはなんぞやという方は下の記事を参照してください!
環境
今回の環境は下記の通りとなります。
今回の環境
- Laravel 5.5
- MySQL 5.6.37
要点と環境
それでは、実際にソースコードを書いていく前に、まず、今回の要点と環境を下記に簡単にまとめます。
- CSVファイルはPOSTで受け渡す
- CSVのデータには、行ごとに「名前」と「メールアドレス」が記載されている
- CSVは「Goodby CSV」ライブラリを使用してパース
- パースしたデータをDB(samplesテーブルと仮定)に保存
- samplesテーブルには「name」と「email」フィールドが存在する
CSVのインポート(読み込み)
では、実際に順を追って説明していきたいと思います。LaravelでCSVを読み込む方法はいくつかありますが、今回は「Goodby CSV」というライブラリを使って読み込んでいきたいと思います。
「Goodby CSV」ライブラリをインストール
まず、今回は「Goodby CSV」ライブラリを使用するのでインストールします。
composer.jsonファイルのrequireに下記のように追記します。
{
~
"require": {
~
"goodby/csv": "*"
},
~
{
上記を追記して保存したら、お決まりのアップデート。
composer update
Modelファイルを作成
次に、Modelファイルを作成していきます。今回はsamplesというテーブルがあると仮定しているので下記コマンドで「Sample.php」というファイルを作成します。
php artisan make:model Sample
ファイルはapp直下に作成されます。
app
├ Sample.php
Viewファイルを作成する
次に、Viewにあたるファイルを作成していきます。今回は「sample.blade.php」というファイルを下記階層に作成します。
resources
├ views
├ sample.blade.php
ソースコードとしては、ファイルを読み込むフォームを下記のような感じで用意します。(formヘルパー使用)
※下記コードはフォームの部分のみになるので、それ以外の箇所は適宜コーディングしてください。
{{ Form::open(['url' => url('/sample'), 'method' => 'POST', 'class' => '', 'files' => true]) }}
{{ Form::close() }}
Controllerファイルを作成する
ModelとViewファイルを作成したので、あとはControllerにあたるファイルを作成していきます。今回は「SampleController.php」というファイルを下記階層に作成します。
app
├ Http
├ Controllers
├ SampleController.php
ファイルを作成したら、Controller部分のソースを書いていきたいと思います。
Goodby CSVをインポートする
まずは、冒頭でインストールした「Goodby CSV」ライブラリをインポートしていきます。
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
Sampleモデルをインポートする
今回は、読み込んだCSVのデータをDBのsamplesテーブルに挿入するので、Sampleモデルをインポートします。(Sampleモデルとsamplesテーブルは紐づいています)
use App\Sample;
csvをインポートする
これで、インポートできる環境が整ったのでCSVをインポートしていきます。下のソースが一応Controller部分(SampleController.php)の完成形のサンプルソースになります。本来であればバリデーションやエラーハンドリングをしなければなりませんが、そちらは別の機会に紹介するとして今回は省きます。
use App\Sample;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
class SampleController extends Controller
{
public function showImportCSV()
{
return view('sample');
}
public function importCSV(Request $request)
{
//postで受け取ったcsvファイルデータ
$file = $request->file('file');
//Goodby CSVのconfig設定
$config = new LexerConfig();
$interpreter = new Interpreter();
$lexer = new Lexer($config);
//CharsetをUTF-8に変換
$config->setToCharset("UTF-8");
$config->setFromCharset("sjis-win");
$rows = array();
$interpreter->addObserver(function(array $row) use (&$rows) {
$rows[] = $row;
});
// CSVデータをパース
$lexer->parse($file, $interpreter);
$data = array();
// CSVのデータを配列化
foreach ($rows as $key => $value) {
$arr = array();
foreach ($value as $k => $v) {
switch ($k) {
case 0:
$arr['name'] = $v;
break;
case 1:
$arr['email'] = $v;
break;
default:
break;
}
}
$data[] = $arr;
}
// DBに一括保存
Sample::insert($data);
return redirect('/sample')->with('save_message', 'CSVのデータを読み込みました');
}
}
実際に、CSVをインポートしている箇所は、importCSV関数内になります。各コードにコメントアウトしているのでわかるかと思いますが、簡単に流れを説明すると下記のようになります。
- フォームデータからCSVファイルを受け取る
- Goodby CSVのconfig設定
- Goodby CSVライブラリでCSVデータをパース
- $data配列に多次元連想配列でデータを格納
- DBに保存
- リダイレクト
routing設定
最後に、下記のようにルーティングを設定(routes/web.php)して完了になります。
Route::get('/sample', 'SampleController@showImportCSV');
Route::post('/sample', 'SampleController@importCSV');
まとめ
ということで、今回はLaravel環境で「Goodby CSV」ライブラリを使ってCSVを読み込む方法を紹介しました。
それでは、今回はここまで!また!
この記事のまとめ
- Laravelで「Goodby CSV」ライブラリを使ってCSVをインポート(読み込み)する方法
非常にこの部分で困っていたので助かりました。
ありがとうございます。