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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5946閲覧

goodby/csvで取り込む際にエスケープされてしまう

ocms

総合スコア53

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/10/01 12:58

goodby/csvでtsvを取り込む処理を作成しています。
しかし、一部文字が混在する際に、tabを無視してしまっています。

取り込みデータ(例
2016-09-30T00:00:00+09:00 bbbb aaaaa 『並行輸入品』 2 FSZ1 販売可 JP
2016-09-30T00:00:00+09:00 cccc ddddd ビデオデッキ 1 FSZ1 販売可 JP

期待する結果
『並行輸入品』 2 がで区切られている =>区切られずつながってしまう。

エラーメッセージ
at HandleExceptions->handleError('8', 'Undefined offset: 7', 'C:\xampp7\htdocs\codehacking\app\Http\Controllers\AdminUploadController.php', '200', array('columns' => array('2016-09-30T00:00:00+09:00', 'bbbb', 'aaaaa', '『並行輸入品』 2', 'FSZ1', '販売可', 'JP'))) in AdminUploadController.php line 200

この場合、どのような設定をさせると、上手く取得できますでしょうか。

php

1 DB::table('fba_inventories')->truncate(); 2 3 $file = Input::file('fba_inventories'); 4 $fileName = $file->getClientOriginalName() . '_' . time(); 5 $move = $file->move(storage_path() . '/upload', $fileName); 6 7 // return print $move; 8 9 10 11 //CSVのパース 12 $config = new LexerConfig(); 13 $config->setDelimiter("\t") 14 ->setToCharset("UTF-8") // Customize file encoding. Default value is null, no converting. 15 ->setFromCharset("SJIS-win") // Customize source encoding. Default value is null. 16 ->setIgnoreHeaderLine(false) 17 ->setEscape("\\"); 18 19 $interpreter = new Interpreter(); 20 21 22 $interpreter->addObserver(function (array $columns) { 23 24// return print $columns[3].":".$columns[4]; 25 26 // CSVファイルを1行ずつ処理 27 DB::table('fba_inventories')->insert( 28 [ 29// 'id' =>'', 30 'date' => $columns[0], 31 'fnsku' => $columns[1], 32 'sku' => $columns[2], 33 'name' => $columns[3], 34 'number' => $columns[4], 35 'fc' => $columns[5], 36 'status' => $columns[6], 37 'country' => $columns[7] 38 ] 39 ); 40 }); 41 42 43 $lexer = new Lexer($config); 44 $lexer->parse($move, $interpreter); 45 46 return back(); 47 48 49

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

『並行輸入品』 2

上記の空白部分はタブではなくて半角スペース4つのようですが?
teratail投稿時に勝手に変換されちゃったのかな??

投稿2016/10/01 13:39

編集2016/10/01 13:42
zico_teratail

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ocms

2016/10/01 23:04

ありがとうございます。 teratail投稿時に変換されてしまったようです。 実際のファイルは正しくtab区切りとなります。 よろしくお願いいたします。
zico_teratail

2016/10/01 23:33 編集

>一部文字が混在する際に 一部文字とは具体的に何でしょうか? >->setFromCharset("SJIS-win") とありますが、ソースデータの文字エンコーディングは本当にSJIS-winでしょうか?
ocms

2016/10/02 03:06

ファイルはSJISとなります。 SJISに変更してみましたが同じ用に、tabが無視されてしまいました。 ->setFromCharset("SJIS") また、ファイルをutf-8に変更し、取り込みも変更てみましたが同様となります。 ->setFromCharset("UTF-8")
退会済みユーザー

退会済みユーザー

2016/10/02 03:28

すでに実施済みかもしれませんが、元データの問題の箇所を、バイナリエディタで見るとどうなっているでしょうか。
ocms

2016/10/02 06:23

一行だと下記となります 32 30 31 36 2D 30 39 2D 33 30 54 30 30 3A 30 30 3A 30 30 2B 30 39 3A 30 30 09 62 62 62 62 09 61 61 61 61 61 09 81 77 95 C0 8D 73 97 41 93 FC 95 69 81 78 09 32 09 46 53 5A 31 09 94 CC 94 84 89 C2 09 4A 50 該当箇所のみは以下となります。 >『並行輸入品』 2(『と2の間は実際にはtabです。) 81 77 95 C0 8D 73 97 41 93 FC 95 69 81 78 09 32
zico_teratail

2016/10/02 07:51

「SJIS」と一口に言ってもいろいろあります。 たとえば↓ Shift_JIS系文字一覧イメージとSJIS・MS932・CP943の違い - instant tools http://tools.m-bsys.com/ex/sjis.php SJISとShift_JISの違いを全部洗い出してみる - Qiita http://qiita.com/yugo-yamamoto/items/751b084786995cd53af5 私も以前、PHPとMySQLとのやり取りでこの辺りのエンコーディングでハマりました。 それと >一部文字とは具体的に何でしょうか? にご回答お願いします。 その「一部文字」が特定されていれば問題解決の糸口になるかもしれないので。
ocms

2016/10/02 08:07

何度もありがとうございます。 >一分文字 以下の用に 品 だけを入れても同様に下記のようなエラーが表示されます。 2016-09-30T00:00:00+09:00 bbbb aaaaa 品 2 FSZ1 販売可 JP エラー at HandleExceptions->handleError('8', 'Undefined offset: 7', 'C:\xampp7\htdocs\codehacking\app\Http\Controllers\AdminUploadController.php', '200', array('columns' => array('2016-09-30T00:00:00+09:00', 'bbbb', 'aaaaa', '品 2', 'FSZ1', '販売可', 'JP'))) in AdminUploadController.php line 200 SJISにも色々あるのですね。こちらも合わせて確認を致します!
zico_teratail

2016/10/02 08:55

AdminUploadController.php line 200とのことですが、この200行目というのは質問文のソースで言うとどの部分が該当しますでしょうか?
ocms

2016/10/02 23:11

冒頭のソースコードの下記が200行目に該当いたします。 'country' => $columns[7]
zico_teratail

2016/10/03 00:14

今回の「タブ区切りが上手くできない」というお悩みと、質問文に掲載されたエラーメッセージは直接関係のない別問題の可能性がありますね。 原因を切り分けてシンプルにするため、まずはエラーとなっている現象を解決したほうがいいと思います。AdminUploadController.phpの200行目に存在するコードを修正してエラーを無くしてください。また、'Undefined offset: 7'という表示も気になりますね。
退会済みユーザー

退会済みユーザー

2016/10/03 00:20

あ、私はてっきりタブ区切りが出来ないので、カラム数が1減ってオフセットが6までとなり、それで7番目のカラムを読もうとしてエラーになっているのだと解釈していました。
zico_teratail

2016/10/03 01:12

>-o.o-さん その可能性も考えたのですが、そうだとしたら $lexer->parse($move, $interpreter); の行でエラーが発生するのではないでしょうか? 200行目の時点ではまだデリミタがタブかどうかは伝わっていないので。
退会済みユーザー

退会済みユーザー

2016/10/03 03:24 編集

私もエラー発生のトリガは最後にparseする時点だと思いますが、出てくるメッセージとしてはそうなのかなと思っていました。ちょうどcsvファイルの読み込みを作っているところなので、実験してみます。
退会済みユーザー

退会済みユーザー

2016/10/05 02:58 編集

わざとカラムの足りないTSVファイルを用意して実験してみました。 5カラムあるTSVファイルの途中の行を2カラムにして読み込ませました。 すると、エラーは最後のparseするところで発生しました。またそのときweb画面上に出たメッセージは以下のようなものでした。 Whoops, looks like something went wrong. 1/1 StrictViolationException in Interpreter.php line 115: Column size should be 5, but 2 columns given 上のほうでいい加減なコメントしてすみませんでした。 また、別途「品」という漢字を混ぜたデータで実験してみましたが、こちらは何の影響もありませんでした。 用意したTSVファイルはWindowsで作成したShift-JISです。 ただサーバ環境が違うので、ここまででいったんレポートさせていただきました。 <実験環境> CentOS 7.2.1511 PHP 7.0.11 nginx 1.10.1 laravel 5.3.16 goodby/csv 1.3.0
退会済みユーザー

退会済みユーザー

2016/10/05 03:25 編集

連投すみません。完全に同じではありませんが、 $config->setFromCharset("SJIS-win") この記述を入れた状態で、データ中に「品」が混ざっていると、文字化けし、 私の環境では、「蜩」という漢字になりました。 このメソッドを除外すると問題ありません。 ※ひとつ上のコメントを書いたときは、このメソッドを入れ忘れて実験していました。また、私は画面表示するとき、mb_convert_encoding($hoge, "UTF-8", "SJIS") を使っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問