前提・実現したいこと
読み込んだCSVデータの列数を正確なものを取得したい。
(この問題に対しての対処方法を知りたい)
発生している問題・エラーメッセージ
全部で739フィールドあるはずなのに、
ものによって1~2フィールド欠けてしまう。
ズレているCSVのデータが以下のようになっていました。
文字コード | カンマ区切りデータ |
---|---|
sjis | "27229022000","中野","","32-5","", |
UTF-8 | "27229022000","����","","�R�Q��T","", |
ずれが発生している該当箇所のレコードの中身
php
1 16 => "27229022000" 2 17 => "中野",",32-5"" 3 18 => ""
処理の順序
1.FTP通信にてcsvファイルをstorage/app 下に保存
2.保存したcsvを読み込む
試したこと
1.処理を切り分けた結果
FTPで取得したCSVの列数はあっているのを確認できたので、
CSVの読み込み部分に問題があることになります。
2.setlocale(LC_ALL, "ja_JP.utf8")から
setlocale(LC_ALL, "Japanese_Japan.932")に変更したが意味なかった;
3.以下のようにコードを変更したがこれも意味がなかった
php
1 public function import() 2 { 3 \Log::channel('batch')->info("START IMPORT" . "\n"); 4 5 setlocale(LC_ALL, "ja_JP.utf8"); 6 $csv_path = 'app/csvs/'. $this->now .'.csv'; 7 8 9 $data = file_get_contents(storage_path($csv_path)); 10 $data = mb_convert_encoding($data, 'UTF-8', 'utf8,SJIS-win'); 11 $temp = tmpfile(); //テンポラリファイルの作成 12 $meta = stream_get_meta_data($temp); //メタデータの取得 13 fwrite($temp, $data); //ファイル書き込み 14 rewind($temp); //ファイルポインタの位置を戻す 15 16 $file = new SplFileObject($meta['uri'], 'rb'); 17 $file->setFlags( 18 \SplFileObject::READ_CSV | 19 \SplFileObject::READ_AHEAD | 20 \SplFileObject::SKIP_EMPTY | 21 \SplFileObject::DROP_NEW_LINE 22 );
CSV読み込みのソースコード
php
1 public function setFile() #FTP先から文字コードsjisのファイルを取得 2 { 3 \Log::channel('batch')->info("START SET CSV" . "\n"); 4 5 Storage::disk('dm_csv')->writeStream( 6 $this->now . '.csv', 7 Storage::disk('ftp')->readStream('data.csv') 8 ); 9 10 \Log::channel('batch')->info("END SET CSV" . "\n"); 11 12 return $this; 13 } 14 15 public function import() 16 { 17 \Log::channel('batch')->info("START IMPORT" . "\n"); 18 19 setlocale(LC_ALL, "ja_JP.utf8"); 20 21 $csv_path = 'app/csvs/'. $this->now .'.csv'; 22 $file = new SplFileObject(storage_path($csv_path), 'rb'); 23 $file->setFlags( 24 \SplFileObject::READ_CSV | 25 \SplFileObject::READ_AHEAD | 26 \SplFileObject::SKIP_EMPTY | 27 \SplFileObject::DROP_NEW_LINE 28 ); 29 30 foreach($file as $val){ 31 var_dump(count($val)); #ここでのカウント数(フィールド)が合わない 32 } 33 34 }