我有一个基本的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);
答案 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
。当它到达文件末尾(新行)时返回FALSE
。 docs向您展示如何正确使用它:
while (($data = fgetcsv($handle)) !== FALSE) {
}
答案 3 :(得分:0)
添加exit();最后,在fclose(handle)之后;