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

loc*_*ock 11 php fopen

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

Gor*_*don 35

是的,你可以轻松地做到这一点 SplFileObject::seek

$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 1000; $i++) {
    echo $file->current(); 
    $file->next();
}
Run Code Online (Sandbox Code Playgroud)

这是来自SeekableIterator接口的方法,不要混淆fseek.

并且因为SplFileObject是可迭代的,所以你可以使用LimitIterator:

$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

同样,这是从零开始的,因此它是1001到2001的行.

  • 请记住,SPL实现的实现方式与第一个建议的解决方案相同.它将从第一个字节开始读取文件,一次一行,并将文件指针保留在所需的行.没有办法解决这个问题. (4认同)
  • +1 SPL非常好,可以使用更多的广告(和文档) (2认同)
  • 哇,我不知道那个,非常感谢你! (2认同)

gro*_*rom 13

您无法从第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);
Run Code Online (Sandbox Code Playgroud)