fputcsv在最后一个元素上添加一行

时间:2013-11-15 17:18:38

标签: php

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

4 个答案:

答案 0 :(得分:7)

我在另一个问题上找到了这个解决方案:https://stackoverflow.com/a/8354413/1564018

$stat = fstat($handle);
ftruncate($handle, $stat['size']-1);

我在fputcsv()之后添加了这两行,并删除了最后一个换行符,删除了文件末尾的空白行。

答案 1 :(得分:1)

就像@Barmar所说,所有的行都有一行结尾,让我们说\ n。您在文件末尾看到的空白行是您的编辑器。一个真正的空白行是两个连续的行尾字符。 (\ n \ n例如)

想象一下你有一个空白文件:

(EOF)

如果你fputcsv这个: 数组(0,“你好”,3323) 你得到

(0,hello,3323\nEOF)

给出PHP文档:

fputcsv()将一行(作为字段数组传递)格式化为CSV并将其写入(以换行符终止)到指定的文件句柄。

然后,编辑器中会出现一个空行。但在文件中没有这样的东西。

答案 2 :(得分:1)

fputcsv在每一行之后添加一个新行,就是它的工作原理。来自docs

  

fputcsv()将一行(作为字段数组传递)格式化为CSV并写入(以换行符终止)

文件末尾的新行不是错误,或者您需要担心的事情。不要试图将其删除,只需将其删除即可。

在评论中,你提到你有一个错误:

  

警告:fputcsv()期望参数2为数组,布尔值为

这可能是因为您没有正确使用fgetcsv。当它到达文件末尾(新行)时返回FALSEdocs向您展示如何正确使用它:

while (($data = fgetcsv($handle)) !== FALSE) {
}

答案 3 :(得分:0)

添加exit();最后,在fclose(handle)之后;