我有一个逐行解析大文件的脚本.当遇到无法处理的错误时,它会停止,通知我们解析的最后一行.
这真的是寻找文件中特定行的最佳/唯一方法吗?(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代码中除外).
如果您只有行号可以继续,则没有其他方法可以找到该行。文件不是基于行的(甚至不是基于字符的),因此无法简单地跳转到文件中的特定行。
可能还有其他读取文件中的行的方法可能会稍微快一些,例如将文件的较大块读入缓冲区并从中读取行,但您只能希望它能快几个百分点。任何在文件中查找特定行的方法仍然必须读取该行之前的所有数据。