如何在PHP中从行X到行Y打开文件?

时间:2009-02-05 05:14:38

标签: php fopen

我在PHP文档中看到的最接近的是fread()一个给定的长度,但是没有指定从哪一行开始。还有其他建议吗?

7 个答案:

答案 0 :(得分:34)

是的,您可以使用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行。

答案 1 :(得分:12)

您无法从第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);

答案 2 :(得分:3)

不幸的是,为了能够从第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

答案 3 :(得分:3)

<强> 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);
?>

答案 4 :(得分:3)

好吧,你不能使用函数fseek来寻找合适的位置,因为它可以使用给定的字节数。

我认为没有某种缓存或一个接一个地通过线路是不可能的。

答案 5 :(得分:0)

如果您正在寻找线路,那么您不能使用fread,因为它依赖于字节偏移,而不是换行符的数量。实际上你必须读取文件才能找到换行符,所以不同的函数更合适。 fgets将逐行读取该文件。把它扔进一个循环中,只捕获你想要的行。

答案 6 :(得分:0)

我很害怕...我猜那是B计划:S

对于我要去的每个AJAX请求:

  1. 将字符串读入我要返回客户端的行数。
  2. 将文件的 rest 复制到临时文件中。
  3. 将字符串返回给客户端。
  4. 它很蹩脚,而且10,000个行文件可能会很慢,但我想这比一遍又一遍地阅读相同,至少每个请求的临时文件越来越短......不? / p>