我创建了一个CSV文件供我们的客户使用
下载$output = fopen('php://output', 'w');
并使用fputcsv()
将数据写入客户端下载的CSV文件中。
我在Linux上运行PHP,因此很多Windows应用程序都不解释行结尾。
我可以将CSV文件写入服务器上的目录,重读并从str_replace()
执行\n
到\r\n
,但这似乎是一种相当笨重的解决方法问题。有没有办法在不创建物理文件的情况下执行转换?
答案 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程序unix2dos
(dos2unix
的反转),假设您安装了它:
fputcsv($fh ...)
exec("unix2dos " . escapeshellarg($filename));
答案 2 :(得分:1)
答案 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(....);