我有一个逐行解析大文件的脚本。当它遇到无法处理的错误时,会停止并通知我们最后一行被解析的位置。
这真的是寻找文件中特定行的最佳/唯一方法吗?(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
seek()
只是执行了您的PHP代码所做的事情(除了以C代码形式)。fseekbyline()
只是 C 代码的包装器会让我感觉更好。哈哈。 - jasonbar我知道现在发帖可能有些晚了,但它可以帮助一些人。 有一天,我写了一个类似于fseekbyline的函数...
function GoToLine($handle,$line)
{
fseek($handle,0); // seek to 0
$i = 0;
$bufcarac = 0;
for($i = 1;$i<$line;$i++)
{
$ligne = fgets($handle);
$bufcarac += strlen($ligne); // in the end bufcarac will contains all caracters until the line
}
fseek($handle,$bufcarac);
}
没有错误系统,如果你想要跳转到第1行或203行但文件为空......那么你将得到没有意义的内容。
同样地,如果你想要跳出eot,也会面临类似的问题。
rewind($handle);
for ($i=0; $i < $desired_line; $i++) {
fgetcsv($handle, 1000, ",");
}
如果我理解正确,您想在找到错误后的某个时间点寻找特定行。如果是这样,您可能会在某个地方存储或打印错误行的行号,具体取决于您所说的“通知”是什么意思。
除非您真的不能使用 fseek()
*,否则您可以存储/打印坏行开始的文件位置。然后您就可以使用 fseek()
。
* 如果存在 fseekbyline()
,那么在这种情况下,该函数如何可用?