【问题标题】:Any workarounds for the PHP fgetcsv bug where whitespace is trimmed?修剪空白的 PHP fgetcsv 错误的任何解决方法?
【发布时间】:2011-04-20 22:19:45
【问题描述】:

鉴于以下 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:我想尽可能利用 fgetcsv,特别是如果引用的字段可用的话。
  • 如果 fgetcsv 不能满足您的需求,您将无法利用它。我可以给你写一个正则表达式来引用未引用的字段。但是,只使用所说的东西进行提取会更明智。
  • 这个人在这里发布了一个解决方法:thuejk.blogspot.com我还没有测试。

标签: php csv


【解决方案1】:

哎呀。 S**t.
我不小心已经写了一个不去除空格的函数:

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

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2013-10-21
    • 1970-01-01
    • 2010-11-09
    • 2016-03-24
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多