例として下記のようなCSVファイルがあったとします
------------ sample.csv ------------
氏名 | 住所 | 郵便番号
────────────
山田 | 太郎 | 1120000
────────────
------------ sample.csv ------------
上記CSVファイル中の"山田"の部分に半角スペースのみが入れた場合に
値をfgetcsv関数を用いて取り出すとNULLになってしまいます
("太郎"の部分に半角スペースがある場合は大丈夫)
この半角スペースをなくさずに半角スペースとしてCSVファイルから取得することは可能でしょうか
解決につながる回答を一番最初にしてくれた方に200P差し上げます
よろしくお願いします
値をfgetcsv関数を用いて取り出すとNULLになってしまいます
WindowsXP + PHP(5.2.5) では現象が確認できませんでした。
ただ、考えられる原因としては2つあります。
これらを解決する方法として、内部処理の文字コードを明示してやることと、fgets, rtrim, split で fgetcsv もどきを用意してみました。お試しください。
<?php mb_internal_encoding('SJIS'); mb_regex_encoding('SJIS'); $infp = fopen('sample.txt', 'r'); while (! feof($infp)) { $s = fgets($infp); if ($s == FALSE || $s == '') break; $s = rtrim($s); $arr = split("\|", $s); foreach ($arr as $val) echo $val . '|'; echo "<br />\n"; } fclose($infp); ?>
太郎の部分でも駄目だと思うのですが、このあたりは仕様のようです。
次善の方法として fgets で読み、split で分割すれば、スペースを含めてデータとして認識できます。
もしくは、データ側で対応できるのであればダブルコーテーションを使用し、 " "とすれば読めます。
C:\test.csv 例
氏名,住所,郵便番号 山田,太郎,1120000 ,太郎,1120000 " ",太郎,1120000 山田, ,1120000 山田,太郎, 山田 ,太郎 ,1120000
ただしこの場合" "の部分は当然ながら、fgets ではこのままデータとなってしまいます。
以下簡単なサンプルです。
<? echo "fgetcsv<br>"; $fp = fopen( "C:\\test.csv", "r"); $row = 1; while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) { $row++; $num = count($data); for ($c=0; $c < $num; $c++) { echo "[".$data[$c]."]\n"; } echo "<br />\n"; } fclose($fp); echo "fget<br>"; $fp = fopen( "C:\\test.csv", "r"); $row = 1; while( !feof($fp) ) { $data = split( ",", fgets($fp) ); $row++; $num = count($data); if ( $num <= 1 ) break; for ($c=0; $c < $num; $c++) { echo "[".$data[$c]."]\n"; } echo "<br />\n"; } fclose($fp); ?>
回答ありがとうございます。
提示していただいたコードを使用したところ半角スペースがきちんと取得できることを確認できました
>fgetcsvはtrim関数のような方法で行頭・行末の空白文字を取り除いていることが影響しているのではないか。
どうやら上記が原因だったようです
fgetcsvが行頭・行末の空白を取り除いていたんですね
ありがとうございます