题
最近我已经看到在PHP文档,是fread()有一定的长度,但是,不指定线从开始。任何其他建议吗?
解决方案
您不会是能够读取从线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);
其他提示
是的,你可以用 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行念给线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);
?>
好了,你不能使用功能FSEEK寻求合适的位置,因为它用的字节数给出工作。
我认为这是不可能没有某种形式的缓存或通过行会一个接一个的。
如果你正在寻找线,然后,因为它依赖于一个字节偏移,不换行的数量,您不能使用FREAD。实际上,你必须阅读文件,找到换行符,所以不同的功能是比较合适的。 与fgets 将读取文件中的行由行。扔在一个循环,并只捕获你想要的行。
我以前很怕那个...我想这是B计划:S
对于每个 AJAX 请求,我将:
- 将我要返回给客户端的行数读入字符串。
- 复制 休息 文件到临时文件中。
- 返回字符串给客户端。
它很蹩脚,而且对于 10,000 多行文件来说,它可能会相当慢,但我想这比一遍又一遍地读取相同的文件要好,至少临时文件随着每个请求而变得越来越短......不?
不隶属于 StackOverflow