fgetcsv在奇数位置拆分列

eCo*_*Evo 3 php csv

我试图让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)" 结尾的大部分完整数据行,然后将其后的每个换行一直视为自己的行.

知道这里发生了什么吗?

Ilm*_*nen 5

问题是您的数据包含字符序列\"".从上下文来看,很明显这应该代表文字子串\"; 也就是说,blackslash应该是一个字面反斜杠,而双引号已经通过加倍来逃避.

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

修复很简单,只要你使用PHP 5.3.0或更高版本:只是告诉fgetcsv()不要将反斜杠视为转义字符,方法是将一些其他字符作为第五个参数传递给它.显然,通过nullfalse''将无法正常工作完全禁用转义字符,但传递'"'(即相同的值作为引号字符)作用:

while ( $row = fgetcsv( $filepointer, 0, ',', '"', '"' ) ) {
    var_export( $row );
    echo "\n";
}
Run Code Online (Sandbox Code Playgroud)