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

Kal*_*sin 7 php csv line-endings

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

$output = fopen('php://output', 'w');
Run Code Online (Sandbox Code Playgroud)

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

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

我可以写CSV文件到服务器上的目录,读回并执行str_replace()\n\r\n,但是这似乎解决问题的一个非常笨拙的方法.有没有办法在不创建物理文件的情况下执行转换?

Ja͢*_*͢ck 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);
Run Code Online (Sandbox Code Playgroud)