😎

Laravelで特定のCSVの行から処理を開始させたい場合

2024/10/22に公開

ミケネコです。本日はニッチな記事を作成します。

本日の内容はDBを使えば一発で解決できる内容ですが、そもそもDBへの追加が制限されていたりDBを使わずに一定期間何万行ずつ処理を実行したいといった時に役に立つかもしれません。
今回そのようなことを行おうとした時にあまり参考文献が見当たらなかったので記事に残しておこうと思いました!
Laravelの環境構築等は、記事が長くなってしまうのでまたの機会に作成しようと思います!

LaravelでCSVを扱うには?

$csvName = 'test.csv';
// CSV情報の取得
$csvContent = new \SplFileObject(storage_path('app/csv/'.$csvName));

$csvContent->setFlags(
  \SplFileObject::READ_CSV |      // CSVとして行を読み込み
  \SplFileObject::READ_AHEAD |    // 先読み/巻き戻しで読み込み
  \SplFileObject::SKIP_EMPTY |    // 空行を読み飛ばす
  \SplFileObject::DROP_NEW_LINE   // 行末の改行を読み飛ばす
);

上記のコードでCSV操作ができるようになります!
SplFileObject について、PHPの標準クラスでファイル操作を行う際に用いることが多いです。
setFlags() でCSVの操作だよとか先頭から読むよとか空行と行末は無視とか様々な設定ができます!

気になった方は以下から調べてみてください。
PHP: Hypertext Preprocessor

じゃあ、どうやったら特定の行を指定できるのか?

今のままでは、CSVの先頭行から操作をすることになります。
seek() を使うことで任意の行から読み込みを開始できます!

$csvContent->seek($line);

$line は、0を起点として数値が入ります。
PHP: Hypertext Preprocessor

全部を通して記載してみよう

$csvName = 'test.csv';
// CSV情報の取得
$csvContent = new \SplFileObject(storage_path('app/csv/'.$csvName));

$csvContent->setFlags(
    \SplFileObject::READ_CSV |      // CSVとして行を読み込み
    \SplFileObject::READ_AHEAD |    // 先読み/巻き戻しで読み込み
    \SplFileObject::SKIP_EMPTY |    // 空行を読み飛ばす
    \SplFileObject::DROP_NEW_LINE   // 行末の改行を読み飛ばす
);

// CSVスタート位置を取得する(今回は省略)
$startLine = $this->getStartLineCsv();

$csvContent->seek($startLine);

foreach($csvContent as $row) {
    // 処理が続く...
}

少し雑なコードですが、CSVの定義の箇所はクラス化をしたりしてみて自分のプロダクトに合う形にしてみてください。
seek() を使うことでCSVを自在に操ることができます😎

とはいってもCSV操作に関するメソッドはまだまだたくさんあるので調べてみてください!
誰かの役に立つといいなと思っています!
また、もう少し詳しく書いて欲しいなどありましたらそのご希望には応えたい
と思っていますのでコメントに記載していただけるとです🙏

では、こちらを見ていただきありがとうございました🙇‍♂️

Discussion