basercms icon indicating copy to clipboard operation
basercms copied to clipboard

fgetcsvRegによるCSV読み込み時に正常にデータを読み取れない場合がある

Open seto1 opened this issue 1 year ago • 6 comments

同じCSVでも特定の行でのみ発生 最初のいくつかの列のデータしか配列に入ってこない状態

baserCMS version : 4.8.2-dev https://github.com/baserproject/basercms/blob/dev-4/lib/Baser/basics.php#L511 5系にも同様の関数が存在する https://github.com/baserproject/basercms/blob/5.1.x/plugins/baser-core/src/Utility/BcUtil.php#L1608

loadCsvToArrayにて、fgetcsvRegをfgetcsvに変更すると正常にデータを読み取れる https://github.com/baserproject/basercms/blob/dev-4/lib/Baser/Model/Datasource/DboSource.php#L4502

TODO

  • 原因となる文字列の特定
  • fgetcsvRegをfgetcsvに置き換えできないかの検討
    • https://www.php.net/manual/ja/function.fgetcsv.php

seto1 avatar Oct 21 '24 08:10 seto1

fgetcsvの代わりにfgetcsvRegを使用しているのは文字化け対策? https://gyagya1111.blogspot.com/2010/12/php5fgetcsv.html sjisの対応をやめたら不要?

seto1 avatar Oct 21 '24 08:10 seto1

特定のこの文字列が含まれていたら発生するというものではなさそう 「"」の出現回数? fgetcsvReg内の正規表現を使った解析部分でデータが消える

seto1 avatar Oct 22 '24 02:10 seto1

以下のcsvをsjisとutf8で作成 DboSource->loadCsvToArray で読み込み loadCsvToArrayのfgetcsvRegとfgetcsvの違いを確認

"a","i","u"
"あ","い","う"

sjis - fgetcsvReg => OK sjis - fgetcsv => OK utf8 - fgetcsvReg => OK utf8 - fgetcsv => OK

"a","i","u","e"
"あ","い","う","能"

sjis - fgetcsvReg => OK sjis - fgetcsv => NG utf8 - fgetcsvReg => OK utf8 - fgetcsv => OK

"a","i","u","能"
"あ","い","う","能"

sjis - fgetcsvReg => NG sjis - fgetcsv => NG utf8 - fgetcsvReg => OK utf8 - fgetcsv => OK

"a","i","u",""""
"あ","い","う","「"」x6000回の繰り返し"

sjis - fgetcsvReg => NG: 行が複数行に分かれる sjis - fgetcsv => OK utf8 - fgetcsvReg => NG: データが途中で消える utf8 - fgetcsv => NG: 行が複数行に分かれる

"a","i","u",""""
"あ","い","う","「"」x13000回の繰り返し"

sjis - fgetcsvReg => NG: 行が複数行に分かれる sjis - fgetcsv => OK utf8 - fgetcsvReg => NG: データが途中で消える utf8 - fgetcsv => NG: 行が複数行に分かれる

sjis - fgetcsvReg(length制限なし) => NG: データが途中で消える sjis - fgetcsv(length制限なし) => OK utf8 - fgetcsvReg(length制限なし) => NG: データが途中で消える utf8 - fgetcsv(length制限なし) => OK

seto1 avatar Oct 22 '24 02:10 seto1

事前にutf8に変換する方法も考えられるけどsjisの対応をやめるのがよさそう fgetcsvのlength指定もなしにする

seto1 avatar Oct 22 '24 02:10 seto1

テーマの初期データ用CSVでsjisが使われているものがあるので、4系でsjisの対応をやめると問題が起きそう 5系は要調査

fgetcsvRegに文字コード渡してutf8の場合はfgetcsvを返す? sjisの問題は残るけど問題は一番少なさそう

5系はsjisのサポート切りたい

seto1 avatar Oct 28 '24 07:10 seto1

5系だと再現しない PHPのバージョンか、なにかの設定値? 最新版では再現しないので優先度下げる

seto1 avatar Nov 08 '24 03:11 seto1