Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将文件从x行读取到y行(使用php)_Php_File_Flat - Fatal编程技术网

如何将文件从x行读取到y行(使用php)

如何将文件从x行读取到y行(使用php),php,file,flat,Php,File,Flat,我在互联网上到处寻找解决方案;但他们都忽视了一个重要问题。最好的解决方案是堆栈溢出 $file = new SplFileObject('longFile.txt'); $fileIterator = new LimitIterator($file, 1000, 2000); foreach($fileIterator as $line) { echo $line, PHP_EOL; } 但与其他方法一样,这需要从文件的开头读取以到达偏移线。通常,它可以忽

我在互联网上到处寻找解决方案;但他们都忽视了一个重要问题。最好的解决方案是堆栈溢出

  $file = new SplFileObject('longFile.txt');
    $fileIterator = new LimitIterator($file, 1000, 2000);
    foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
    } 
但与其他方法一样,这需要从文件的开头读取以到达偏移线。通常,它可以忽略不计;但是对于大文件(比如数百万行),这会大大降低处理速度。随着偏移量的增加,时间单调增加。如果将偏移量设置为数百万,则处理时间将为几秒钟


在数据库(如mysql)中,我们对表进行索引以读取一行,而无需遍历整个数据库。是否有必要使用文件密钥(行号)执行此操作?我想知道像SQLite和Berkeley DB这样的平面文件数据库是如何索引它们的表的。

没有办法查找特定的行,因为“行”术语只是一种约定。第行是“一组由\n分隔的字符”。而file对这个惯例一无所知。所以要得到第N行,需要逐字符遍历,以计算所需的行数

正如您所提到的,您可以使用某种自定义创建的索引(如
行数-字节偏移量
列表)来提高性能,但要构建它,您仍然需要解析文件。


<?php

    $strings = file_get_contents($file);

    $length= strlen($strings);

    for($i=0;$i<$length;$i++) {
        print $strings{$i};
    }

?>

上面的代码将以字符串形式获取文件内容,然后逐个迭代每个字符,现在取决于您如何使用它们。

这里的概念问题是,文件只是字符串,其中一些字符表示行尾。因此,如果不先读取文件,就不可能知道行的开始和结束位置

如果要不断读取文件,则首先扫描文件,并将行的偏移量记录到某种索引中,然后使用和精确读取所需的行

正如您所提到的,数据库可以为您完成类似的工作,因此,您可以逐行读取文件并将这些行插入数据库中,其中一些字段存储行号,然后通过查询获得所需的行,而不是创建您自己的数据库