PHP从大文本600MB文件中读取特定行

PHP从大文本600MB文件中读取特定行,php,Php,我有一组文本文件,它们的文件大小非常大。 我不想阅读整个文件。我只对以**DATA IMP开头并以**DATA END结尾的块感兴趣。此块之间的任何数据对我来说都很重要 但是,此块可能出现在文件的开始处、文本文件的结束处或之间。 我希望这个读取过程是快速的,比如说,如果它是在文本文件的开头,那么它应该和linux-head一样快,而linux-head对于大文件来说需要的时间非常少 读取这些大文件的最佳方式是什么?因此,一旦我得到这个块,我就不必一直读到最后了? 文件内容示例:(600 MB或更

我有一组文本文件,它们的文件大小非常大。 我不想阅读整个文件。我只对以
**DATA IMP
开头并以
**DATA END
结尾的块感兴趣。此块之间的任何数据对我来说都很重要

但是,此块可能出现在文件的开始处、文本文件的结束处或之间。 我希望这个读取过程是快速的,比如说,如果它是在文本文件的开头,那么它应该和linux-head一样快,而linux-head对于大文件来说需要的时间非常少

读取这些大文件的最佳方式是什么?因此,一旦我得到这个块,我就不必一直读到最后了?

文件内容示例:(600 MB或更大)

编辑: *好的,我假设数据在文件的顶部,因为我没有其他选择* 文件内容示例:(600 MB或更大)


只要文件不在索引、数据库或类似文件中,就必须遍历整个文件,直到找到
**DATA IMP

另一种选择是,如果该文本位于某个位置,而您的位置不是

如果要提取文本,请执行以下操作:

$file = new SplFileObject("file.txt");

$lines = array();

while (!$file->eof())
{
  $line = $file->fgets();

  if ($line === '** DATA IMP')
    break;
}

$line = $file->fgets();

while($line != '** DATA END')
{
   $lines[] = $line;
   $line = $file->fgets();
}

使用SplFileObject类

首先使用SplFileObject::fgets:

Returns a string containing the next line from the file, or FALSE on error.
像这样的

$file = new SplFileObject("file.txt");
while (!$file->eof()) {
   $line = $file->fgets();
   if ($line === 'needle') break;
}

然后,您可以使用
$counter
变量作为包含针的行的参考。在那之后,得到你想要的信息是非常简单的。想找回那条线吗?还是后面的整个文件?还是在它之前?转到此处,使用静态函数执行任何其他需要执行的操作。

您是否尝试过以下操作:

<?php
    $raw = shell_exec('grep \'\*\*\' /path/to/file');
    var_dump($raw);
?>


抱歉,刚刚在评论中注意到您在Windows上。我想肯定有一个Windows版本的grep,这可能值得一看。

我想我将不得不依赖外部工具,如grep linux(用于Windows) 根据我的理解,对于我的特殊需求,它比php有更好的性能


如果您不同意,请添加评论。

与grep相当的Windows是findstr:

在文件中搜索字符串


我想要中奖的彩票号码,但这不可能。您需要扫描整个文件,直到到达数据端。可能的方法是读取每一行或进行grepping。Head不会帮助您,因为它只会显示文件的顶部x行,而与contentOk无关。欢迎使用任何可能最快的php解决方案。我在windows上,所以不能使用grep。在windows中增加php服务器执行时间有一个名为“findstr”的命令,您尝试过吗?它相当于“grep”,似乎grep也适用于windows。假设数据在文件的开头?然后呢?如果我没有其他选择,我也可以将这些数据显示在文件的顶部。@django我更改了回答如果文件被新行打断,它可以工作。如果没有换行符,它只会转储整个文件。顺便说一句,我同意,grep更快。我在数据中有新行。请看一下这个线程,然后:+1,因为SplFileObject实际上有一个获取特定行的方法:
$file = new SplFileObject("file.txt");
while (!$file->eof()) {
   $line = $file->fgets();
   if ($line === 'needle') break;
}
<?php
    $raw = shell_exec('grep \'\*\*\' /path/to/file');
    var_dump($raw);
?>