2013-11-15 49 views
0

我有一个基本的PHP脚本,可以从数组中创建一个csv文件。下面是代码示例:fputcsv添加一行以最后一个元素结尾

$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将通过一个Warning,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); 
+5

所有行应该有一个行后面结束。一个空行将是连续的两条新行。 – Barmar

+0

在文件末尾有空行有什么问题?为什么这是不需要的?当我打开文件时,我运行了你的代码并且Excel显示了2行。 –

+0

该脚本实际上是一个类的一半,它需要一个csv,将其转换为一个数组,然后返回一个新的csv(以便您可以使用PHP来更改CSV)。我不希望任何额外的行不在原始文档中。 – user1564018

回答

6

我发现了另一个问题该解决方案:)https://stackoverflow.com/a/8354413/1564018

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

我将这两行fputcsv后(他们最后删除换行符,删除文件末尾的空白行。

+1

这在技术上是对原始问题的答案,但问题最终变得毫无意义,因为我没有意识到文档末尾的新行是预期的。查看评论。 – user1564018

+0

这完美地工作。谢谢!我希望我不必处理这个问题,但我正在生成CSV文件,以便通过MS Word的邮件合并功能进行处理......这是一件非常美妙的事情......不幸的是,由于规范不明确,我不能直接责怪MS开发人员关于如何结束CSV文件的最后一行[https://tools.ietf.org/html/rfc4180],但他们的解决方案是在用户输入一个错误,当“空行”为空时,最后一条记录为空处理。感谢您帮助我解决了这个错误信息。 – deadpixel

1

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

假设你有一个空白文件:

(EOF) 

如果fputcsv这样的:阵列(0, “你好”,3323)

(0,hello,3323\nEOF) 

给出PHP文档:

fputcsv()格式的线(作为字段数组传递)为CSV并写入它(以换行符结尾)到指定的文件句柄。

然后您的编辑器中会出现空白行。但在文件中没有这样的事情。

1

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

​​3210

在文件末尾的新行是不是一个错误,或者是你需要担心。不要试图删除它,只要放弃它。

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

Warning: fputcsv() expects parameter 2 to be array, boolean given

这可能是因为你没有使用正确fgetcsv。它在到达文件结尾(新行)时返回FALSEdocs告诉你如何正确使用它:

while (($data = fgetcsv($handle)) !== FALSE) { 
} 
相关问题