对于修剪空白的 PHP fgetcsv bug 有什么解决方法吗?

发布于 2024-11-02 07:43:58 字数 554 浏览 0 评论 0原文

给定以下 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

Given the following string of CSV data (I am unable to ensure the fields are quoted)

AB,CD,   EF,GH,   IJ

and PHP code of:

$arr = fgetcsv($f);

(assuming $f is a valid file-pointer reading a file containing the above text) - one would expect this result:

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

when in fact you get:

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

This is problematic if you need positional context within that field.

Any workarounds of still being able to take advantage of fgetcsv, but ensuring that whitespace is not lost?

The bug is reported here: http://bugs.php.net/bug.php?id=53848

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飞烟轻若梦 2024-11-09 07:43:58

哎呀。操蛋。
我不小心已经写了一个不会删除空格的函数:

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));

Oooops. S**t.
I accidently already wrote a function which doesn't strip the spaces:

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]);
}

Use it like:

$arr = str_getcsv2(fgets($f));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文