我试图让 fgetcsv() 读取逗号分隔值文件。通常这会按预期工作,但我遇到了一个文件,其中一些列被拆分为新的数据行而不是被视为一个。

这是一个给我带来麻烦的行的示例:
pastie.org/5664800

产生问题的列是多行构成描述的列。

fgetcsv 在到达以下行时结束第一次读取:

- Length/Width/Height: 3.75\""x2.4\""x2.4\"" (95.25X60.96x60.96)

例如,如果我有代码:
ini_set('auto_detect_line_endings', true);

while ($row = fgetcsv($filepointer, 5000, ',', '"') {
    echo '<pre>'; var_dump($row); echo '</pre><br />';
}

我得到了一行以“Length/Width/Height: 3.75\"x2.4\""x2.4\"" (95.25X60.96x60.96) ”结尾的几乎完整的数据,然后每个换行符都被视为自己的行,一直到最后。

知道这里发生了什么吗?

最佳答案

问题是您的数据包含字符序列 \"" 。从上下文中,很明显这应该表示文字子字符串 \" ;也就是说,黑斜线应该是一个字面反斜线,而双引号已经通过加倍转义了。

但是,默认情况下, fgetcsv() 将反斜杠视为转义字符,因此它将字符 \" 解析为反斜杠转义的文字双引号,然后假定第二个 " 结束双引号字符串。

修复很简单,只要您使用 PHP 5.3.0 或更高版本:只需告诉 fgetcsv() 不要通过将其他字符作为第五个参数传递给它来将反斜杠视为转义字符。显然,传递 nullfalse'' 不能完全禁用转义字符,但传递 '"' (即与引号字符相同的值)可以:

while ( $row = fgetcsv( $filepointer, 0, ',', '"', '"' ) ) {
    var_export( $row );
    echo "\n";
}

关于php - fgetcsv 在奇数位置拆分列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14267356/

10-10 06:41