4

我试图让 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)然后将之后的每个换行符都视为自己的行,一直到最后。

知道这里发生了什么吗?

4

2 回答 2

5

问题是您的数据包含字符序列\""。从上下文来看,很明显 this应该表示字面量 substring \";也就是说,黑斜杠应该是文字反斜杠,而双引号已通过加倍来转义。

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

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

while ( $row = fgetcsv( $filepointer, 0, ',', '"', '"' ) ) {
    var_export( $row );
    echo "\n";
}
于 2013-01-11T00:39:33.627 回答
0

fgetcsv()的第五个参数是当它出现在封闭的字符串中时如何转义 " 封闭字符

于 2013-01-10T21:19:37.533 回答