我在 PHP 文档中看到的最接近的方法是使用 fread() 读取指定长度的内容,但它并没有指定从哪一行开始。您有其他建议吗?
使用 SplFileObject::seek
可以轻松实现该功能。
$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
echo $file->current();
$file->next();
}
这是来自SeekableIterator接口的方法,不要与fseek
混淆。
由于SplFileObject是可迭代的,所以您甚至可以使用LimitIterator
更轻松地完成它:
$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
echo $line, PHP_EOL;
}
同样的,这是从零开始计算的,因此它是第1001到第2001行。
因为行的长度可能是任意的,所以你将无法从第X行开始读取。因此,你需要从开头开始阅读并计算已读取的行数,直到达到第X行。例如:
<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
$lineNo++;
if ($lineNo >= $startLine) {
echo $line;
}
if ($lineNo == $endLine) {
break;
}
}
fclose($f);
好的,您不能使用函数fseek来寻找适当的位置,因为它是按照给定字节数工作的。
我认为,如果没有某种缓存或者一个一个地查找每一行,这是不可能实现的。
很遗憾,要想从第x行读取到第y行,您需要能够检测到换行符...并且必须扫描整个文件。但是,假设您不是出于性能原因而询问此事,则可以使用以下代码获取第x
到第y
行:
$x = 10; //inclusive start line
$y = 20; //inclusive end line
$lines = file('myfile.txt');
$my_important_lines = array_slice($lines, $x, $y);
请参阅:array_slice
<?php
$f = fopen('sample.txt', 'r');
$lineNo = 0;
$startLine = 3;
$endLine = 6;
while ($line = fgets($f)) {
$lineNo++;
if ($lineNo >= $startLine) {
echo $line;
}
if ($lineNo == $endLine) {
break;
}
}
fclose($f);
?>
我就怕这样...那么只能执行计划B了 :S
对于每个AJAX请求,我将会:
这很糟糕,而且在有10,000多行的文件时可能会非常慢,但我想这比一遍又一遍地读取相同的内容要好,至少每次请求后临时文件都会变得更短...不是吗?
如果你正在寻找行数,那么你不能使用fread,因为它依赖于字节偏移量,而不是换行符的数量。实际上,你必须读取文件以查找换行符,因此另一个函数更合适。fgets将逐行读取文件。将其放入循环中并仅捕获你想要的行。