CSVファイルを正しくインポートしたい
PHPのGoodby/CSVを使用してcsvファイルのインポートを試みているのですが、
データの末尾の文字が「子」や「ト」の場合、区切りとして使用しているカンマがデータとして扱われ、
隣のカラムの文字列と繋がってしまいます。
繋がってしまう文字列でコードの変換等試していた所、
以下の2点からGoodby/CSVで行内を分割する時にSJISでカンマを見ている様にも思えるのですが、解決に至っていません。
・UTF-8 → SJIS → UTF-8 で復元不可(末尾が?になる)
・UTF-8で保存したcsvをExcelでSJISとして読み込むと対象の行のみ列数が少ない
繋がってしまっている列がカンマで分かれる様にする方法が知りたいです。
よろしくお願いします。
発生している問題
インポート対象のcsv(UTF-8/BOM無し)
id,好き/嫌い,名前,値段 1,1,みかん,50 2,0,パン,100 3,1,ポテト,70 4,1,餃子,500 5,0,チョコ,200
↓
下記ソースコードのvardumpで出力した内容
3行目の「ポテト」と4行目の「餃子」に4列目の数字まで含まれてしまう
array(4) { [0]=> string(1) "1" [1]=> string(1) "1" [2]=> string(9) "みかん" [3]=> string(2) "50" } array(4) { [0]=> string(1) "2" [1]=> string(1) "0" [2]=> string(6) "パン" [3]=> string(3) "100" } array(3) { [0]=> string(1) "3" [1]=> string(1) "1" [2]=> string(12) "ポテト,70" } array(3) { [0]=> string(1) "4" [1]=> string(1) "1" [2]=> string(10) "餃子,500" } array(4) { [0]=> string(1) "5" [1]=> string(1) "0" [2]=> string(9) "チョコ" [3]=> string(3) "200" }
該当のソースコード
public function regist(Request $rq){ // ファイルアップロード有無の確認分岐 if($rq->hasFile('csv') && $rq->file('csv')->isValid()){ //CSVファイル保存 $tmpname = uniqid("CSVUP_").".".$rq->file('csv')->guessExtension(); $rq->file('csv')->move(public_path()."/csv/tmp",$tmpname); $tmppath = public_path()."/csv/tmp/".$tmpname; //Goodby CSVの設定 $config_in = new LexerConfig(); $config_in ->setFromCharset("UTF-8") ->setToCharset("UTF-8") ->setIgnoreHeaderLine(true); $lexer_in = new Lexer($config_in); $datalist = array(); $interpreter = new Interpreter(); $interpreter->unstrict(); $interpreter->addObserver(function (array $row) use (&$datalist){ var_dump($row); //ここで取り込んだ行を確認 $datalist[] = $row; }); }
参考:https://laraweb.net/tutorial/5906/
試したこと
(1)csvファイルはExcelのVBAを使用し、UTF-8で保存した物だけど、メモ帳でも形式をUTF-8で指定して再保存してインポート→ 解消せず
(2)データを「"」や「'」で囲んだ上で、Goodby/csvの設定でも明記 → 解消せず
(3)区切りをタブに変更し、Goodby/csvの設定でも明記 → 解消せず
(4)csvをSJISで保存の上で、serFromをSJISに変更して取り込み → 解消せず
補足情報(FW/ツールのバージョンなど)
Windows10
PHP 7.4.6
Laravel Framework 7.14.1
あなたの回答
tips
プレビュー