【问题标题】:How to read a file from line x to line y (with php)如何从第 x 行读取文件到第 y 行(使用 php)
【发布时间】:2011-09-14 06:08:46
【问题描述】:

我已经在整个互联网上进行了探索以找到解决方案;但他们都忽略了一个重要问题。最好的解决方案是在 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 这样的平面文件数据库是如何索引它们的表的。

【问题讨论】:

    标签: php file flat


    【解决方案1】:

    没有办法找到特定的行,因为“行”一词只是一个约定。行是“由 \n 分隔的字符集”。而且文件不知道这个约定。因此,要获得第 N 行,您需要逐个字符地遍历以计算所需的行数。

    正如您所提到的 - 您可以使用某种自定义创建的索引(例如 row number - offset in bytes 列表)来提高性能,但是要构建它,您仍然需要解析文件。

    【讨论】:

      【解决方案2】:

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

      如果要不断读取文件,则首先扫描文件并将行的偏移量记录到某种索引中,然后使用fseek()fread() 准确读取您想要的行。

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

      【讨论】:

        【解决方案3】:
        <?php
        
            $strings = file_get_contents($file);
        
            $length= strlen($strings);
        
            for($i=0;$i<$length;$i++) {
                print $strings{$i};
            }
        
        ?>
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-14
          • 2017-01-04
          • 1970-01-01
          相关资源
          最近更新 更多