我已经在互联网上寻找解决方案;但他们都忽略了一个重要的问题。最佳解决方案是Stack Overflow中的
$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
echo $line, PHP_EOL;
}
但与其他方法一样,这需要从文件的开头读取以到达偏移线。通常,它可以忽略不计;但是对于大型文件(比如数百万行),这会显着减慢这个过程。时间随着偏移的增加而单调增加。如果将偏移量设置为数百万,则处理时间将为几秒钟。
在数据库(如mysql)中,我们将表索引为读取一行而不遍历整个数据库。是否用文件密钥(行号)做这样的事情?我想知道像SQLite和Berkeley DB这样的平面文件数据库如何为它们的表编制索引。
答案 0 :(得分:2)
没有办法寻找特定的行,因为“行”术语只是一个约定。行是“由\ n分隔的字符集”。并且文件不知道这个约定。因此,要获得第N行,您需要遍历char by char以计算所需的行数。
正如您所提到的 - 您可以使用某种自定义创建的索引(如row number - offset in bytes
列表)来提高性能,但要构建它,您还是需要解析文件。
答案 1 :(得分:1)
这里的概念问题是文件只是字符串,其中一些字符表示行的末尾。因此,如果不首先读取文件就不可能知道行的开始和结束位置。
如果要不断读取文件,则首先扫描文件并将行的偏移记录到某种索引中,然后使用fseek()和fread()精确读取所需的行。
正如您所提到的,数据库可以为您执行类似的工作,因此,您可以逐行读取文件,并在数据库中插入一些存储行号的字段,而不是创建自己的数据库。然后通过查询获得所需的行。
答案 2 :(得分:-1)
<?php
$strings = file_get_contents($file);
$length= strlen($strings);
for($i=0;$i<$length;$i++) {
print $strings{$i};
}
?>
上面的代码将以字符串形式获取文件内容,然后逐个迭代每个字符,现在由你决定如何使用它们。