我相信这有一个简单的解释,我只是看不到它。我想生成一个非常简单的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"
任何人都知道为什么这些字段都不是全部引用的?我很可能在文档页面上遗漏了一些内容,任何见解都很受欢迎!
答案 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.'"';
}