如何更改fputcsv使用的行结尾?

时间:2012-10-04 08:08:04

标签: php csv line-endings

我创建了一个CSV文件供我们的客户使用

下载
$output = fopen('php://output', 'w');

并使用fputcsv()将数据写入客户端下载的CSV文件中。

我在Linux上运行PHP,因此很多Windows应用程序都不解释行结尾。

我可以将CSV文件写入服务器上的目录,重读并从str_replace()执行\n\r\n,但这似乎是一种相当笨重的解决方法问题。有没有办法在不创建物理文件的情况下执行转换?

5 个答案:

答案 0 :(得分:18)

您可以使用流过滤器来完成此操作。此示例写入物理文件,但它也适用于php://output

// filter class that applies CRLF line endings
class crlf_filter extends php_user_filter
{
    function filter($in, $out, &$consumed, $closing)
    {
        while ($bucket = stream_bucket_make_writeable($in)) {
            // make sure the line endings aren't already CRLF
            $bucket->data = preg_replace("/(?<!\r)\n/", "\r\n", $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}
// register the filter
stream_filter_register('crlf', 'crlf_filter');

$f = fopen('test.csv', 'wt');
// attach filter to output file
stream_filter_append($f, 'crlf');
// start writing
fputcsv($f, array('1 1', '2 2'));
fclose($f);

答案 1 :(得分:2)

不确定您是否可以使用PHP本身。可能有一种方法可以改变PHP的EOL文件编写,但它可能与系统有关。你没有可以ping的Windows系统,对吗? ;)

对于一个真正的解决方案,而不是str_replace逐行,您可以使用Linux程序unix2dosdos2unix的反转),假设您安装了它:

fputcsv($fh ...)
exec("unix2dos " . escapeshellarg($filename));

答案 2 :(得分:1)

  1. 在Linux计算机上使用\ n行结尾创建文件
  2. 将文件从Linux机器FTP转换为Windows机器
  3. 嘿嘿!所有行结尾现在都是\ n \ n \ n \ n在Windows计算机上的文件

答案 3 :(得分:0)

如果在Macintosh计算机上或由Macintosh计算机读取文件时,PHP无法正确识别行尾,则启用auto_detect_line_endings运行时配置选项可能有助于解决问题。 ini_set(“ auto_detect_line_endings”,true);

答案 4 :(得分:-2)

不是编写文件,更好的解决方案是使用输出缓冲

function output($buffer) {
    return str_replace("\r", "\r\n", $buffer);
} 

ob_start('output');
fputcsv(....);
相关问题