我试图让fgetcsv()读取逗号分隔值文件.通常这可以按预期工作,但我遇到了一个文件,其中一些列被拆分为新的数据行而不是被视为一个.
这是一个给我带来麻烦的行的例子: pastie.org/5664800
创建问题的列是具有构成描述的多行的列.
当fgetcsv到达以下行时结束第一次读取:
- Length/Width/Height: 3.75\""x2.4\""x2.4\"" (95.25X60.96x60.96)
Run Code Online (Sandbox Code Playgroud)
所以,例如,如果我有代码:
ini_set('auto_detect_line_endings', true);
while ($row = fgetcsv($filepointer, 5000, ',', '"') {
echo '<pre>'; var_dump($row); echo '</pre><br />';
}
Run Code Online (Sandbox Code Playgroud)
我得到一个以" Length/Width/Height: 3.75\"x2.4\""x2.4\"" (95.25X60.96x60.96)" 结尾的大部分完整数据行,然后将其后的每个换行一直视为自己的行.
知道这里发生了什么吗?
问题是您的数据包含字符序列\"".从上下文来看,很明显这应该代表文字子串\"; 也就是说,blackslash应该是一个字面反斜杠,而双引号已经通过加倍来逃避.
但是,默认情况下,fgetcsv()将反斜杠视为转义字符,因此它将字符解析\"为反斜杠转义的文字双引号,然后假定第二个"结束双引号字符串.
修复很简单,只要你使用PHP 5.3.0或更高版本:只是告诉fgetcsv()不要将反斜杠视为转义字符,方法是将一些其他字符作为第五个参数传递给它.显然,通过null或false或''将无法正常工作完全禁用转义字符,但传递'"'(即相同的值作为引号字符)作用:
while ( $row = fgetcsv( $filepointer, 0, ',', '"', '"' ) ) {
var_export( $row );
echo "\n";
}
Run Code Online (Sandbox Code Playgroud)