fseek()一行,而不是字节?

jas*_*bar 18 php file fgets

我有一个逐行解析大文件的脚本.当遇到无法处理的错误时,它会停止,通知我们解析的最后一行.

这真的是寻找文件中特定行的最佳/唯一方法吗?(fseek()在我的情况下不可用.)

<?php

for ($i = 0; $i < 100000; $i++)
    fgets($fp); // just discard this
Run Code Online (Sandbox Code Playgroud)

我使用它没有问题,它足够快 - 它只是感觉有点脏.根据我对底层代码的了解,我不认为有更好的方法可以做到这一点.

sal*_*the 35

寻找文件中特定行的简单方法是使用SplFileObject该类,该类支持寻找行号(seek())或字节偏移量(fseek()).

$file = new SplFileObject('myfile.txt');
$file->seek(9999);     // Seek to line no. 10,000
echo $file->current(); // Print contents of that line
Run Code Online (Sandbox Code Playgroud)

在后台,seek()只需执行PHP代码所做的操作(在C代码中除外).


Guf*_*ffa 5

如果您只有行号可以继续,则没有其他方法可以找到该行。文件不是基于行的(甚至不是基于字符的),因此无法简单地跳转到文件中的特定行。

可能还有其他读取文件中的行的方法可能会稍微快一些,例如将文件的较大块读入缓冲区并从中读取行,但您只能希望它能快几个百分点。任何在文件中查找特定行的方法仍然必须读取该行之前的所有数据。