
Photo by
katsuo515
LaravelでTSV(CSV)ファイルを扱う
LaravelでTSVファイルからデータベースに初期データを投入したく、自分が分からなかった点をまとめます😊
TSVファイルをどこに置くか
Laravelのdatabaseディレクトリ配下に置くと良さそう。
ヘルパのdatabase_path()を使うとdatabaseディレクトリの完全パスが生成されます。
// database/
$path = database_path();
// database/service/users.tsv
$path = database_path('service/users.tsv');
ファイルを扱う時に使うPHP構文
LaravelではなくPHP構文の紹介です。TSVを読み込み、データベースに保存しやすいような配列にしていきます。
■ファイルまたはディレクトリが存在するかどうか調べる
$path = database_path('service/users.tsv');
// ファイルがあればtrue
$fileExists = file_exists($path);
■TSVから行を取り出し、配列を生成する
use \SplFileObject;
$file = new SplFileObject($path);
PHPで操作できるようTSVパスから配列にします。これで変数$fileからフィールドごと値が取り出せるようになります。
■TSVの行の配列を生成
ちなみにこんなTSVファイルを用意しています。
$file = new SplFileObject($path);
$headField = $file->fgetcsv("\t", '"');
これで先頭行の配列が取得できます。
nextすることで次の行を取り出せます。
$file->next();
$field = $file->fgetcsv("\t", '"');
ループ処理を書き、最後の行を読み込むまでnextしてあげると全データが取得できます。
TSVのデータをデータベースに保存する
最終的に取り出したデータを多次元の連想配列にします。
$users = array(
array( "name" => "山田太郎", "age" => 17 ),
array( "name" => "山田花子", "age" => 23 ),
array( "name" => "山田一郎", "age" => 51 )
);
foreach ($users as $user) {
DB::table('users')->insert($user);
}
LaravelのSeeder機能を使って、データベースに保存することでTSVから初期データを用意できます。
🎉🎉🎉
Laravelをもっと詳しく知りたい方はこちらの本がわかりやすいです。
いいなと思ったら応援しよう!
