回车 return 和换行
Carriage return and line feed
我遇到了回车 return 和换行问题。当我 运行 我的脚本它在最后一个字段的双引号内显示 CR,LF 并且之后还有另一个 LF,实际上 CR,LF 应该在文本的双引号之外并且不应该有另一个 LF。有人可以告诉我我做错了什么吗?
这是我的代码
$jobno = 5285;
$directory = "../CSV/";
$filename = $jobno.'.csv';
if( is_dir($directory) === false )
{
mkdir($directory); // Create new directory
}
$newFname = $directory.$filename;
$file = fopen($newFname, 'w');
$jobdetails="2,000 Items Supplied";
$customerName="Snap Pitzaa Ltd";
$workflow="CSV_wise";
$jobqty=50;
$filepath="Data/Snap Pitzaa/design.pdf \r\n";
$data = array(
array($jobno, $jobdetails, $customerName, $workflow, $jobqty, $filepath),
array('Data 21', 'Data 22', 'Data 23', 'Data 24', 'Data 25', 'Data 26'),
);
// save each row of the data
foreach ($data as $row)
{
fputcsv($file, $row);
}
// Close the file
fclose($file);
我已经尝试了所有的东西,比如单引号,在 $filepath
的双标头之外,但是 none 是有效的。这是记事本++中的输出
fputcsv
由换行符 (docs) 终止。因此,您不需要将 \r\n
添加到 $filepath
变量。
这个:
$filepath="Data/Snap Pitzaa/design.pdf \r\n";
应该改成这样:
$filepath='Data/Snap Pitzaa/design.pdf';
那应该删除 "CRLF" 并将引号移动到您想要的位置。
编辑 2016 年 12 月 13 日
从您的评论来看,您似乎需要将 fputcsv
默认输出的 unix 样式的行结尾替换为 windows 样式的行结尾。我见过的最优雅的方法来自 this SO question:
// Writes an array to an open CSV file with a custom end of line.
//
// $fp: a seekable file pointer. Most file pointers are seekable,
// but some are not. example: fopen('php://output', 'w') is not seekable.
// $eol: probably one of "\r\n", "\n", or for super old macs: "\r"
function fputcsv_eol($fp, $array, $eol) {
fputcsv($fp, $array);
if("\n" != $eol && 0 === fseek($fp, -1, SEEK_CUR)) {
fwrite($fp, $eol);
}
}
刚刚给自己介绍了 PHP(我以前从未使用过它),我认为下面的代码将正确地在您编写的每条记录的末尾写入一个 CR/LF:
foreach ($data as $row)
{
// write out the normal output, with a LF automatically created by fputcsv
fputcsv($file, $row);
// move the file pointer back to the end of the data
fseek($file, -1, SEEK_CUR);
// write out a CR/LF
fwrite($file, "\r\n");
}
你也应该改变
$filepath="Data/Snap Pitzaa/design.pdf \r\n";
至
$filepath="Data/Snap Pitzaa/design.pdf";
因为不应该 CR/LF 该字段。
我遇到了回车 return 和换行问题。当我 运行 我的脚本它在最后一个字段的双引号内显示 CR,LF 并且之后还有另一个 LF,实际上 CR,LF 应该在文本的双引号之外并且不应该有另一个 LF。有人可以告诉我我做错了什么吗?
这是我的代码
$jobno = 5285;
$directory = "../CSV/";
$filename = $jobno.'.csv';
if( is_dir($directory) === false )
{
mkdir($directory); // Create new directory
}
$newFname = $directory.$filename;
$file = fopen($newFname, 'w');
$jobdetails="2,000 Items Supplied";
$customerName="Snap Pitzaa Ltd";
$workflow="CSV_wise";
$jobqty=50;
$filepath="Data/Snap Pitzaa/design.pdf \r\n";
$data = array(
array($jobno, $jobdetails, $customerName, $workflow, $jobqty, $filepath),
array('Data 21', 'Data 22', 'Data 23', 'Data 24', 'Data 25', 'Data 26'),
);
// save each row of the data
foreach ($data as $row)
{
fputcsv($file, $row);
}
// Close the file
fclose($file);
我已经尝试了所有的东西,比如单引号,在 $filepath
的双标头之外,但是 none 是有效的。这是记事本++中的输出
fputcsv
由换行符 (docs) 终止。因此,您不需要将 \r\n
添加到 $filepath
变量。
这个:
$filepath="Data/Snap Pitzaa/design.pdf \r\n";
应该改成这样:
$filepath='Data/Snap Pitzaa/design.pdf';
那应该删除 "CRLF" 并将引号移动到您想要的位置。
编辑 2016 年 12 月 13 日
从您的评论来看,您似乎需要将 fputcsv
默认输出的 unix 样式的行结尾替换为 windows 样式的行结尾。我见过的最优雅的方法来自 this SO question:
// Writes an array to an open CSV file with a custom end of line.
//
// $fp: a seekable file pointer. Most file pointers are seekable,
// but some are not. example: fopen('php://output', 'w') is not seekable.
// $eol: probably one of "\r\n", "\n", or for super old macs: "\r"
function fputcsv_eol($fp, $array, $eol) {
fputcsv($fp, $array);
if("\n" != $eol && 0 === fseek($fp, -1, SEEK_CUR)) {
fwrite($fp, $eol);
}
}
刚刚给自己介绍了 PHP(我以前从未使用过它),我认为下面的代码将正确地在您编写的每条记录的末尾写入一个 CR/LF:
foreach ($data as $row)
{
// write out the normal output, with a LF automatically created by fputcsv
fputcsv($file, $row);
// move the file pointer back to the end of the data
fseek($file, -1, SEEK_CUR);
// write out a CR/LF
fwrite($file, "\r\n");
}
你也应该改变
$filepath="Data/Snap Pitzaa/design.pdf \r\n";
至
$filepath="Data/Snap Pitzaa/design.pdf";
因为不应该 CR/LF 该字段。