fputcsv中的enclosure参数不符合预期

时间:2011-06-28 04:46:29

标签: php

我相信这有一个简单的解释,我只是看不到它。我想生成一个非常简单的csv delimetered文件,在字段值周围加上双引号。

根据the manual page on fputcsv(),我尝试明确地传递分隔符和封装参数,以便在第三方应用程序中导入数据所需的双引号字段值,如下面的函数调用:

    // relevant line of codes ...
    while($row = mysql_fetch_array($result)){

        $name_pieces = "";  
        $name_pieces = explode(" ", $row['name']);  

        $numberOfPieces = count($name_pieces);

        $lastNameIndex = $numberOfPieces - 1;

        $lastname = $name_pieces[$lastNameIndex];
        $firstname = $name_pieces[0];

 }   // Line array becomes the first, second, third fields in resulting .csv output.

    $line = array( $row['username'], 
                   $row['name'], 
                   $firstname,
                   $lastname,
                   $row['description'] );

 $data[] = $line;

}        
foreach($data as $dataLine){
    if(fputcsv($fh, $dataLine, ',', '"') === false){
      die("Unable to write to csv file.");
    }
}

以下是脚本的.csv输出示例,请注意只引用了第二个和最后一个字段。

AG,"Alan Gaulois",Alan,Gaulois,"(AG) Alan Gaulois"
COMMIS,commis,commis,commis,"(COMMIS) commis"
DU,"Denis Fargo",Denis,Fargo,"(DF) Denis Fargo"

任何人都知道为什么这些字段都不是全部引用的?我很可能在文档页面上遗漏了一些内容,任何见解都很受欢迎!

3 个答案:

答案 0 :(得分:4)

据我所知,是的,只有在有空格的情况下才需要分隔符,如果你需要别的东西,可以考虑使用array_map

类似的东西:

function surroundWithQuotes ($input)
{
    $input = str_replace('"', '""', $input); //escaping in csv files is done by doing the same quote twice, odd
    return '"' . $input . '"';
}

foreach($data as $dataLine){
    if(fputcsv($fh, array_map("surroundWithQuotes" $dataLine),$dataLine, ',', '') === false){
      die("Unable to write to csv file.");
    }
}

答案 1 :(得分:2)

如果需要,该函数只设置引号。如果您要编写的字符串中没有空格,特殊字符或引号,则不需要包含引号。

$enclosure参数不会告诉解析器“你必须引用所有内容”,但它会告诉解析器,哪个char用于引用(默认情况下它 {{ 1}},所以你不必写它。)

答案 2 :(得分:0)

上面提到的答案中缺少某些内容,如果是空字符串,则谓词或回调函数将返回“”。

理想情况下应该是。

function encloseWithQuotes($value)
{
    if (empty($value)) {
        return "";
    }
    $value = str_replace('"', '""', $value);
    return '"'.$value.'"';
}