前提・実現したいこと
PHPのfgetcsv関数を使って、CSVの値を正しく取得したいです。
(取得した値は項目ごとにデータベースに登録しますが、今回の質問ではデータベース登録部分は割愛します。)
下記URLを参考にしており、CSVの中身は至ってシンプルです。
簡単に変換できる!PHPでCSVファイルを読み込む方法
名前 | 年齢 | 血液型 |
---|---|---|
太郎 | 21 | O |
ジョン | 23 | A |
ニキータ | 32 | AB |
次郎 | 22 | B |
【test.csv】上記のような表でカンマ形式にしたものが保存されています。(文字コードはUTF-8)
CSV
1名前,年齢,血液型 2太郎,21,O 3ジョン,23,A 4ニキータ,32,AB 5次郎,22,B
値を表示するための実際のソースコード
PHP
1// ここにCSV名を入力する (文字コードはUTF-8) 2$csvfilename = "test.csv"; 3 4// 読み込み用にcsvを開く 5$f = fopen($csvfilename, "r"); 6 7while($line = fgetcsv($f)){ 8// 1行ずつCSV項目を表示させる 9 echo "<pre>"; 10 print_r( $line ); 11 echo "</pre>"; 12}
発生している問題
ソースコードもCSVも何も変更していないにも関わらず、プログラム処理するたびに表示結果が変わることがあります。
(結果1および結果2になります。)
どんなときに結果1が出て、どんなときに結果2が出るのか再現性が取れず困っています。
【結果1】正しく値が取得できており、各行3列ずつ表示されている
【結果2】正しく値が取得できておらず、"太郎,21"のように値のなかにカンマが入ってしまっています。結果的に列数が異なる扱いとなります。
補足情報(動作環境)
PHP Version 7.4.9
XAMPP v3.2.4 (Windows)
備考
- MACの開発環境で試すと、結果2は表示されず、常に結果1となります。(Windowsのみの事象でしょうか)
- 外部サイトを見ると、fputcsv関数にはバグがあるというような記載もあり、今回のトラブルにあてはまるのかもしれません。
それでは、何卒よろしくお願いします。
先輩エンジニアの皆さまから解決の糸口を拝借できれば幸いです。
追記
検証してみると、全角文字のマルチバイトに起因しているかもしれないと考えています。
(例えそうだとした場合、なぜWindowsのみで起こるのかについては解決しませんが。)
全てのカンマで結果2のようなことが起こるのではなく、いつも特定の文字に繋がるカンマのみにこの事象が発生します。
例) 次郎、太郎のような"郎"。ひらがなの"し"。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/06 23:13
2020/09/06 23:57