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

2022-08-30 21:44:47

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

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

<?php

for ($i = 0; $i < 100000; $i++)
    fgets($fp); // just discard this

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


答案 1

查找文件中特定行的一种简单方法是使用 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

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


答案 2

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

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


推荐