【问题标题】:How to get number of lines with SplFileObject?如何使用 SplFileObject 获取行数?
【发布时间】:2012-01-10 17:08:09
【问题描述】:
$file = new SplFileObject('/path/to/file.txt');

如何使用SplFileObject 查找文件中的行数?

【问题讨论】:

    标签: php spl


    【解决方案1】:

    为什么不简单地使用文件处理程序并在this question 中做类似的事情?它简单、快速且非常高效。

    如果你绝对必须使用 spl,你可以这样做

    $file = new SplFileObject("/path/to/file.txt");
    $i = 0;
    while (!$file->eof()) {
        $i++;
        $file->next();
    }
    print "file has " . $i . " lines"; 
    

    【讨论】:

    • 按照您的建议,我使用 fopen/fgets 传统方式读取文件,谢谢。有时我只是在不需要的时候尝试用类来做所有事情。
    • 如果您想以面向对象的方式进行文件处理,这正是 SPL 存在的原因。
    【解决方案2】:

    SplFileObject 提供了一个迭代器,每行一次迭代:

    $numberOfLines = iterator_count($file);
    

    函数iterator_count是你的朋友,为你做遍历并返回迭代次数。

    您可以利用文件对象的SKIP_EMPTY flag 不计算该文件中的空行。

    【讨论】:

    • 很好的答案,但在较大的文件(在这种情况下为 10mb 和 135,000+ 行)上,它完全太慢,并且尝试使用这种方法进行计数实际上会导致超时。
    【解决方案3】:

    iterator_count 和使用next() 的逐行迭代在我在 Ubuntu 下的 php 版本 5.3.7 中被破坏。

    fseek([any offset], SEEK_END) 方法似乎也坏了。 key() 返回 0。

    使用seek($lineCount) 遍历大文件太慢了。

    最简单的 5.3.7 验证方式是

    // force to seek to last line, won't raise error
    $file->seek($file->getSize());
    $linesTotal = $file->key();
    

    现在计算 30000 行需要 0.00002 秒,并且需要大约 20 kb 的内存。

    迭代方法大约需要 3 秒。

    【讨论】:

    • 这是错误的,seek() 将查找行号,而 getSize() 将返回文件大小(以字节为单位)。
    • 我知道。它只是确保我们查找了 all 文件行(即使它们都是空的)。在最常见的情况下,seek() 将在绝对小于字节数的行号上遇到 EOF,但 PHP 会默默地处理它,返回最后一行号。同意,这是肮脏的黑客,但我没有找到任何“干净”的方法来快速计算行数。
    • 工作正常。但是文件有 99 行但它返回 98。你知道为什么吗?
    • 注意:key 返回最后一行的索引,所以这总是比总数少一个。您需要在总数中加一:$linesTotal = $file->key() + 1;
    【解决方案4】:

    我同意Николай Конев 关于使用seek function 比逐行浏览整个文件要快得多,但正如Twisted1919 所说,使用文件大小来查找最后一行令人困惑,所以我的建议是使用@ 987654323@而不是文件大小:

    // force to seek to last line, won't raise error
    $file->seek(PHP_INT_MAX);
    $linesTotal = $file->key();
    

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多