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

时间:2013-08-02 06:16:02

标签: php

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

但是,此块可能会出现在文件的开始结束 文本文件中。 我希望这个阅读过程很快。让我们说如果它是在文本文件的开头它应该像linux -head一样快,这对于大文件只需要很少的时间。

读取这些大文件的最佳方法是什么,所以一旦我得到这个块,我不必阅读文件直到结束?

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

Dummy text
Dummy text
Dummy text
Dummy text
** DATA IMP
** d
** e
** f
** g
** DATA END
Dummy text
Dummy text
Dummy text
AND SO ON ...

修改 * OK。我假设数据位于文件顶部,因为我没有其他选项。 * 文件内容示例:(600 MB或更高)

** DATA IMP
** d
** e
** f
** g
** DATA END
Dummy text
Dummy text
Dummy text
Dummy text
Dummy text
Dummy text
AND SO ON ...

5 个答案:

答案 0 :(得分:2)

使用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变量作为对哪一行包含针的参考。在那之后,获得你想要的信息是非常微不足道的。想要检索那条线?还是之后的整个文件呢?还是之前呢?转到此处并使用SplFileObject静态函数执行您需要执行的任何操作。

答案 1 :(得分:0)

只要文件不在索引,数据库或类似文件中,您就必须浏览整个文件,直至找到** 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();
}

答案 2 :(得分:0)

你有没有试过像:

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

抱歉,您在评论中注意到您在Windows上。我想必须有grep的Windows版本,可能值得研究。

答案 3 :(得分:0)

我认为我将不得不依赖外部工具,如grep linux(对于windows gnu32) 根据我的理解,我的特定需求比php更好。

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

答案 4 :(得分:0)

与grep等效的Windows是findstr:

搜索文件中的字符串。

findstr