我有一个基本的PHP脚本,可以从数组创建一个csv文件。下面是一个代码示例:
$array = [
[1,2,3],
[4,5,6]
];
$handle = fopen('test.csv', 'w');
foreach($array as $v)
fputcsv($handle, $v);
fclose($handle);
生成的文件在文件末尾始终有一个空行,因为 fputcsv 不知道这是最后一行。关于如何防止这种情况的任何(简单)想法?
编辑:
原来的问题现在无关紧要(对我来说,但也许有人需要这样做)。 fputcsv 应该添加一个新行,即使在文档的末尾,这是所有 CSV 文件的预期行为。
我标记了解决原始问题的答案,即使它不再与我相关。
所以在我的上下文中,我需要检查数组的最后一行(或任何行)是否为 NULL(否则 PHP 将通过警告 fputcsv 的第二个参数为 null)。如果有人感兴趣,这是我更新的脚本:
$array = [
[1,2,3],
[4,5,6]
];
$handle = fopen('test.csv', 'w');
foreach($array as $v)
if($v != NULL)
fputcsv($handle, $v);
fclose($handle);
我在另一个问题上找到了这个解决方案:https://stackoverflow.com/a/8354413/1564018
$stat = fstat($handle);
ftruncate($handle, $stat['size']-1);
我在 fputcsv() 之后添加了这两行,它们删除了最后一个换行符,删除了文件末尾的空行。
添加 exit(); 在最后,在 fclose(handle) 之后;
就像@Barmar说的,所有行都有一个行尾,假设 '。您在文件末尾看到的空白行是您的编辑器在这样做。真正的空行是连续的两个行尾字符。('' 例如)
假设您有一个空白文件:
(EOF)
如果你 fputcsv 这个: array(0,"hello",3323) 你会得到
(0,hello,3323'nEOF)
给定的 PHP 文档:
fputcsv() 将一行(作为字段数组传递)格式化为 CSV 并将其写入(以换行符终止)到指定的文件句柄。
然后,编辑器中会出现一个空行。但是在文件中没有这样的事情。
fputcsv
每行后添加一个新行,这就是它的工作原理。 从文档中:
fputcsv() 将一行(作为字段数组传递)格式化为 CSV 并写入(以换行符终止)
文件末尾的新行不是错误,也不是您需要担心的事情。 不要试图删除它,只是离开它。
在评论中,您提到您遇到了一个错误:
警告:fputcsv() 期望参数 2 是数组,给定布尔值
这可能是因为您没有正确使用fgetcsv
。 当它到达文件末尾(换行符)时,它会返回FALSE
。 这些文档向您展示了如何正确使用它:
while (($data = fgetcsv($handle)) !== FALSE) {
}