我正在编写一个使用fputcsv()
处理CSV输出的函数。我已经解决了许多人\r\n
所带来的可怕fputcsv()
问题(参见代码)。
现在,我正在尝试弄清楚如何处理字段中包含的\r
或\n
个字符(不是返回的行返回\r\n
)。是否应该在传递到fputcsv()
之前以某种方式进行转义?
该函数可以很好地处理大多数字符的转义。但是,当\n
插入字段时,MS Excel和Google文档都会出现\n
问题,并且无法正确加载CSV。
/*
* Revised Get CSV Line using PHP's fputcsv()
*
* Used to correct an issue with fputcsv()
* http://stackoverflow.com/questions/4080456/fputcsv-and-newline-codes
* MS Excel needs the MS Windows newline format of \r\n
*
*/
if (!function_exists('get_csv_line'))
{
function get_csv_line($list, $seperator = ",", $enclosure = '"', $newline = "\r\n")
{
$fp = fopen('php://temp', 'r+');
fputcsv($fp, $list, $seperator, $enclosure );
rewind($fp);
$line = fgets($fp);
if ($newline && $newline != "\n") {
if ($line[strlen($line)-2] != "\r" && $line[strlen($line)-1] == "\n") {
$line = substr_replace($line,"",-1) . $newline;
} else {
die( 'original csv line is already \r\n style' );
}
}
if ($newline == "\r\n" && substr($line, -2) != "\r\n") {
log_message('error', 'function get_csv_line: Error, needs \r\n to be MS Excel friendly!');
}
return $line;
}
}
答案 0 :(得分:3)
如果字段中有\ r或\ n,请确保整个字段用双引号括起来(并且双字引号是双引号)
所以
的最终结果value1,"so this is a
multiline value",value2
其中'a'和'multiline'由\ n或\ r分隔(记住,\ r \ n不会显示在excel上,但它会在那里显示),那么它应该有效。
如果\ n或\ r \ n值嵌入在PHP数组中的值中,那么它应该已经适当地包含在内。
答案 1 :(得分:0)
包含BOM的UTF文件将导致Excel在字面上处理新行,即使该字段被引号括起来也是如此。 (经过测试的Excel 2008 Mac)
解决方法是将任何新行换回(CHR 13)而不是换行。