fseek() 按行,而不是字节?
我有一个脚本,可以逐行解析大文件。当它遇到无法处理的错误时,它会停止,通知我们解析的最后一行。
这真的是寻找文件中特定行的最佳/唯一方法吗?(在我的情况下不可用。fseek()
<?php
for ($i = 0; $i < 100000; $i++)
fgets($fp); // just discard this
我使用这个没有问题,它足够快 - 它只是感觉有点脏。根据我对底层代码的了解,我不认为有更好的方法来做到这一点。
我有一个脚本,可以逐行解析大文件。当它遇到无法处理的错误时,它会停止,通知我们解析的最后一行。
这真的是寻找文件中特定行的最佳/唯一方法吗?(在我的情况下不可用。fseek()
<?php
for ($i = 0; $i < 100000; $i++)
fgets($fp); // just discard this
我使用这个没有问题,它足够快 - 它只是感觉有点脏。根据我对底层代码的了解,我不认为有更好的方法来做到这一点。
查找文件中特定行的一种简单方法是使用 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()
如果您只有行号可以继续,则没有其他方法可以找到该行。文件不是基于行的(甚至不是基于字符的),因此无法简单地跳转到文件中的特定行。
可能还有其他方法可以读取文件中的行,这些方法可能稍微快一些,例如将较大的文件块读取到缓冲区并从中读取行,但您只能希望它快百分之几。在文件中查找特定行的任何方法仍然必须读取该行之前的所有数据。