【问题标题】:fputcsv adds a line ending on the last elementfputcsv 在最后一个元素处添加一行
【发布时间】:2013-11-15 17:18:38
【问题描述】:

我有一个基本的 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 的第二个参数为空)。如果有人感兴趣,这是我更新的脚本:

$array = [
    [1,2,3],
    [4,5,6]
];

$handle = fopen('test.csv', 'w');

foreach($array as $v)
    if($v != NULL)
        fputcsv($handle, $v);

fclose($handle);

【问题讨论】:

  • 所有行都应该有一行结尾。空行将是连续的两个换行符。
  • 文件末尾有空行有什么问题?为什么这是不受欢迎的?我运行了你的代码,打开文件时 Excel 显示了 2 行。
  • 脚本实际上是一个类的一半,它接受一个 csv,将其转换为一个数组,然后返回一个新的 csv(以便您可以使用 PHP 来更改 CSV)。我不想要任何不在原始文档中的额外行。
  • @user1564018:文件中的“额外行”应该不会导致任何问题。这不是您需要担心的问题。
  • 例如,如果我运行了一个 csv,其中额外的行通过脚本结束,我得到:警告:fputcsv() 期望参数 2 是数组,给定布尔值

标签: php


【解决方案1】:

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

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

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

【讨论】:

  • 这是“技术上”原始问题的答案,但问题最终无关紧要,因为我没有意识到文档末尾的新行是预期的。见 cmets。
  • 这非常有效。谢谢!我希望我不必处理这个问题,但我正在生成 CSV 文件以供 MS Word 的邮件合并功能处理……真是一件美妙的事情……不幸的是,我不能直接责怪 MS 开发人员,因为规范是模棱两可的关于 CSV 文件的最后一行应该如何结束 [tools.ietf.org/html/rfc4180] 但他们的解决方案是在处理“空行”时向用户抛出最后一条记录为空的错误。感谢您帮助我消除该错误消息。
【解决方案2】:

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

假设你有一个空白文件:

(EOF)

如果你 fputcsv 这个:array(0,"hello",3323) 你会得到

(0,hello,3323\nEOF)

给定 PHP 文档:

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

那么您的编辑器中应该会出现一个空行。但是文件中没有这样的东西。

【讨论】:

    【解决方案3】:

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

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

    文件末尾的新行不是错误,也不是您需要担心的事情。不要试图删除它,直接离开它。

    在 cmets 中,您提到您遇到了一个错误:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您能解释一下 not 如何在文件末尾添加新行吗?看看其他答案
      猜你喜欢
      • 2020-07-02
      • 2015-09-22
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      相关资源
      最近更新 更多