【问题标题】:Reading specific line of a file in PHP在 PHP 中读取文件的特定行
【发布时间】:2012-02-21 08:06:08
【问题描述】:

我正在用 php.ini 读取文件。 我需要读取文件的特定行。

我使用了这个代码:

fseek($file_handle,$start);
while (!feof($file_handle)) 
{   
    ///Get and read the line of the file pointed at.
    $line = fgets($file_handle);
    $lineArray .= $line."LINE_SEPARATOR";

    processLine($lineArray, $linecount, $logger, $xmlReply);

    $counter++;
}
fclose($file_handle);

但是我意识到fseek() 采用字节数而不是行号。

PHP 是否有其他函数以行号为基础?

或者我是否每次都必须从头开始读取文件,并且有一个 计数器直到我想要的行号被读取?

我正在寻找一种有效的算法,跨步超过 500-1000 Kb 的文件以到达所需的行似乎效率低下。

【问题讨论】:

    标签: php file


    【解决方案1】:

    使用SplFileObject::seek

    $file = new SplFileObject('yourfile.txt');
    $file->seek(123); // seek to line 124 (0-based)
    

    【讨论】:

    • 感谢@JRL,但搜索是否基于字节?而不是行号?
    • 使用 splfileobject 并没有提供 fopen 提供的功能。有没有一种简单的方法可以将此对象转换为 fopen 资源?
    【解决方案2】:

    这对你有用吗?

    $file = "name-of-my-file.txt";
    $lines = file( $file ); 
    echo $lines[67]; // echos line 68 (lines numbers start at 0 (replace 68 with whatever))
    

    您显然需要在打印之前检查这些行是否存在。好用吗?

    【讨论】:

    • 感谢@vivid-colours,但因为我正在读取一个大文件,比如日志文件 :( 我需要读取前 100 个然后只读取下一个 onScroll..so 虽然我知道从下一个读取哪一行我正在研究如何直接读取该行..
    【解决方案3】:

    你可以这样做:

    $lines = file($filename); //file in to an array
    echo $lines[1];           //line 2
    

    $line = 0;
    $fh = fopen($myFile, 'r');
    
    while (($buffer = fgets($fh)) !== FALSE) {
       if ($line == 1) {
           // $buffer is the second line.
           break;
       }   
       $line++;
    }
    

    【讨论】:

      【解决方案4】:

      您必须从头开始阅读。但是,如果文件从不/很少更改,您可以将行偏移缓存在其他地方,也许在另一个文件中。

      【讨论】:

      • 缓存偏移量是什么意思?当我再次调用文件读取时,我可以直接转到我需要读取的剩余行吗? @Ignacio Vazquez-Abrams?
      【解决方案5】:

      试试这个,最简单的一个

      $buffer=explode("\n",file_get_contents("filename"));//Split data to array for each "\n"
      

      现在缓冲区是一个数组,每个数组索引包含每一行; 获取第 5 行

      echo $buffer[4];
      

      【讨论】:

        【解决方案6】:

        您可以使用函数 file($filename) 。该函数将文件中的数据读入数组中。

        【讨论】:

          猜你喜欢
          • 2011-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          相关资源
          最近更新 更多