質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

Goodby/csvでのインポート時に特定文字の後ろのカンマが区切りとして扱われない

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 256

saraos

score 0

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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る