見出し画像

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ファイルを用意しています。

スクリーンショット 2020-04-05 13.00.08

$file = new SplFileObject($path);
$headField = $file->fgetcsv("\t", '"');

これで先頭行の配列が取得できます。

スクリーンショット 2020-04-05 13.05.21

nextすることで次の行を取り出せます。

$file->next();
$field = $file->fgetcsv("\t", '"');

スクリーンショット 2020-04-05 13.06.56

ループ処理を書き、最後の行を読み込むまで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をもっと詳しく知りたい方はこちらの本がわかりやすいです。



スキ頂けると嬉しいです〜