PHP fgetcsv有空格被修剪的bug,有什么解决方法吗?

6

给定以下CSV数据字符串(我无法确保字段已被引用)

AB,CD,   EF,GH,   IJ

并且 PHP 代码如下:

$arr = fgetcsv($f);

(假设 $f 是一个有效的文件指针,读取包含上述文本的文件)- 预期结果如下:
Array('AB', 'CD', '   EF', 'GH', '   IJ');

实际上你得到的是:

Array('AB', 'CD', 'EF', 'GH', 'IJ');

如果您需要在该字段内部保留位置上下文,则这是有问题的。

是否有任何解决方法仍然可以利用fgetcsv,但确保不会丢失空格?

该错误在此处报告:http://bugs.php.net/bug.php?id=53848


这对我来说是个好消息。PHP的行为基本上符合我的预期。无论如何,你可以直接使用 explode(",", $line),因为那正是你想要的。 - mario
@mario:但是在每种情况下都不起作用。 - Chris Laplante
@mario:如果可能的话,我想要利用fgetcsv函数,特别是在有引号字段的情况下。 - drowe
如果fgetcsv不能满足您的需求,那么您就无法利用它。我可以为您编写一个正则表达式来引用未引用的字段。但最好还是使用提取工具来进行提取。 - mario
这个人在这里发布了一个解决方法:http://thuejk.blogspot.com/ 我还没有测试过。 - Raisen
1个回答

6

糟糕了,我不小心写了一个函数,它没有去掉空格:

function str_getcsv2($line, $del=",", $q='"', $esc="\\") {
    $line = rtrim($line, "\r\n");
    preg_match_all("/\G ([^$q$del]*) $del | $q(( [$esc$esc][$q]|[^$q]* )+)$q $del /xms", "$line,", $r);
    foreach ($r[1] as $i=>$v) {  // merge both captures
        if (empty($v) && strlen($r[2][$i])) {
            $r[1][$i] = str_replace("$esc$q", "$q", $r[2][$i]);  // remove escape character
        }
    }
    return($r[1]);
}

使用方式如下:

$arr = str_getcsv2(fgets($f));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接