BETA

laravel5.8¦CSVファイルのヘッダーを毎回判定してインポートする

投稿日:2020-04-02
最終更新:2020-04-02

CSVのインポートでヘッダーの位置が都度都度変わる可能性があるので(そんなことあるのか)、ヘッダーを毎回判定してDBへインポートしてほしいとのことなので実装してみました。

環境
・laravel 5.8
・php 7.2

Goodby CSVをつかう

Goodby CSV自体の設定については調べるとたくさんでてくるので割愛

ヘッダーも読み込むようにする

$config = new LexerConfig();  
$config->setDelimiter(',')  
       ->setToCharset('UTF-8')  
       ->setFromCharset('sjis-win');  

->setIgnoreHeaderLine(true) でヘッダーを飛ばしてしまうので消しました。

ヘッダーとインサートしたいデータにわける

$rowsにヘッダーもインサートしたいデータも$interpreter->addObserverでいれて多次元配列になっている状態です。
$headerListsには定数ファイルなどで作成したヘッダーの配列をいれておきます。
ヘッダーが足りない場合はエラーを表示するようにしていますが、array_diffは重複していない値がとれるので、ふくめてほしいヘッダー名をエラーメッセージに追加することも可能です👌

// ヘッダーとインサートしたいデータにわける  
$headers = array_slice($rows, 0, 1, true);   
$header = array_flatten($headers);  

// header数のチェック  
if(!empty(array_diff($headerLists,$header))){  
    return $error = ['error_messages' => 'ヘッダー情報が存在しません'];  
}  

// unsetでヘッダー分の配列をつめてインサートしたいデータのみにする  
unset($rows[0]);  
foreach($rows as $row) {  
    $convertRows[] = array_combine($header, $row);  
}  

これ以降のコードは調べるとたくさんでてくるのですが、foreachとswitch文を使用しました!

動作のまとめ

・array_sliceで特定の配列だけとりだす
・array_sliceでとりだした分の配列をunsetでつめる
・array_combineでインサートしたいデータの配列のkeyをヘッダー名にする

🍬🍬🍬

あまりクリティカルに使うことはそうそうないとは思いますが…
実装してほしいといわれたときは難しすぎんか〜〜〜と思ったのですが、意外となんとかなってよかったです‥

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

メモしていきますφ('ᴗ'」)

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう