(PHP)CSVファイルの1列目の半角スペースについて


例として下記のようなCSVファイルがあったとします

------------ sample.csv ------------
氏名 | 住所 | 郵便番号
────────────
山田 | 太郎 | 1120000
────────────
------------ sample.csv ------------

上記CSVファイル中の"山田"の部分に半角スペースのみが入れた場合に
値をfgetcsv関数を用いて取り出すとNULLになってしまいます
("太郎"の部分に半角スペースがある場合は大丈夫)

この半角スペースをなくさずに半角スペースとしてCSVファイルから取得することは可能でしょうか
解決につながる回答を一番最初にしてくれた方に200P差し上げます
よろしくお願いします

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/07/25 13:11:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント200pt

値をfgetcsv関数を用いて取り出すとNULLになってしまいます

WindowsXP + PHP(5.2.5) では現象が確認できませんでした。

ただ、考えられる原因としては2つあります。

  • php.iniとsample.txtの文字コードが一致していないのではないか。
  • fgetcsvはtrim関数のような方法で行頭・行末の空白文字を取り除いていることが影響しているのではないか。

これらを解決する方法として、内部処理の文字コードを明示してやることと、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);
?>
id:jayz

回答ありがとうございます。

提示していただいたコードを使用したところ半角スペースがきちんと取得できることを確認できました

>fgetcsvはtrim関数のような方法で行頭・行末の空白文字を取り除いていることが影響しているのではないか。

どうやら上記が原因だったようです

fgetcsvが行頭・行末の空白を取り除いていたんですね

ありがとうございます

2008/07/25 13:11:16
id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント10pt

太郎の部分でも駄目だと思うのですが、このあたりは仕様のようです。


次善の方法として 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);
?>

http://php.benscom.com/manual/ja/function.split.php

http://phpspot.net/php/man/php/function.fgetcsv.html

  • id:Mook
    Pahoo さんと同様の回答でしたが、空白が無視されるのは先頭と最後だけでしたか?
    こちらでは間のデータでも同様になりましたが。

    データの加工が可能なら" "で囲むことで認識させることが可能です。
    詳細は回答内に書きましたが、不要でしたら無視してください。

この質問への反応(ブックマークコメント)

トラックバック

  • 2008年7月25日(金) クライアントサイド技術 MOONGIFT: &#187; JavaScriptで実現するMVCフレームワーク「JavaScriptMVC」:オープンソースを毎日紹介 JavaScript 点数制限なしで切り替え対応させるにはどう
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません