【发布时间】:2011-02-18 00:16:21
【问题描述】:
我在 PHP 文档中看到的最接近的方法是 fread() 给定长度,但这并没有指定从哪一行开始。还有其他建议吗?
【问题讨论】:
我在 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);
【讨论】:
不幸的是,为了能够从第 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);
【讨论】:
Here is the possible solution :)
<?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);
?>
【讨论】:
$startLine 和$endLine 变量,它只会读取这些行。
好吧,你不能使用函数 fseek 来寻找合适的位置,因为它适用于给定的字节数。
我认为没有某种缓存或逐行遍历是不可能的。
【讨论】:
如果您要查找行,则不能使用 fread,因为它依赖于字节偏移量,而不是换行符的数量。实际上,您必须阅读文件才能找到换行符,因此使用不同的函数更合适。 fgets 将逐行读取文件。将其放入循环中并仅捕获您想要的行。
【讨论】:
我很害怕...我猜那是 B 计划:S
对于每个 AJAX 请求,我将:
这很糟糕,如果有 10,000 多行文件,它可能会很慢,但我想这比一遍又一遍地阅读要好,至少每次请求都会使临时文件变短...不是吗?
【讨论】: