fputcsv 添加一行以最后一个元素结尾


fputcsv adds a line ending on the last element

我有一个基本的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) {
}