【问题标题】:When creating a CSV file, how do I handle \n and \r characters in a field?创建 CSV 文件时,如何处理字段中的 \n 和 \r 字符?
【发布时间】:2011-12-21 05:43:57
【问题描述】:

我正在编写一个函数来使用 fputcsv() 处理 CSV 输出。我已经解决了很多人在使用fputcsv() 时遇到的可怕的\r\n 问题(参见代码)。

现在我试图弄清楚如何处理字段中包含的\r\n 字符(不是行尾返回\r\n)。在传递到fputcsv() 之前是否应该以某种方式逃脱?

该函数可以很好地处理大多数字符的转义。但是,当将 \n 插入到字段中时,MS Excel 和 Google Docs 都会出现 \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;
    }
}

【问题讨论】:

  • 我应该用空格替换字段中的 \n 和 \r 吗?
  • 我以前做过类似的事情,CSV 是一件糟糕的事情,你甚至可能会遇到诸如包含你的附件或分隔符号的字段之类的问题。我最终不得不为这些符号选择一些异国语言字符,并运行一个非常长的脚本来检查那些 \n\r 并确保有足够的封闭和分隔字符。

标签: php codeigniter csv


【解决方案1】:

如果字段中有 \r 或 \n,只需确保整个字段都用双引号括起来(并且文字双引号是双双引号)

所以对于

的最终结果
value1,"so this is a
multiline value",value2

如果 'a' 和 'multiline' 由 \n 或 \r 分隔(请记住,\r 不会显示在 excel 上,但它在那里),那么它应该可以工作。

如果 \n 或 \r 值嵌入到 PHP 数组中的值中,那么它应该已经被适当地括起来了。

【讨论】:

    【解决方案2】:

    包含 BOM 的 UTF 文件将导致 Excel 按字面意思处理新行,即使该字段被引号包围。 (测试 Excel 2008 Mac)

    解决方案是将任何新行设为回车符 (CHR 13) 而不是换行符。

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      相关资源
      最近更新 更多