创建CSV文件时,如何处理字段中的\ n和\ r \ n字符?

时间:2011-11-03 14:19:42

标签: php codeigniter csv

我正在编写一个使用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;
    }
}

2 个答案:

答案 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)而不是换行。