2013-08-02 141 views
3

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

然而这个块可以出现在开始文件的,在之间的文本文件。 我希望这个阅读过程快速。让我们说,如果它是在文本文件的开始处,它应该像linux一样快 - 这对大文件来说花费的时间非常短。

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

文件内容示例:(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.I我假设的数据是在文件的顶部,因为我没有其他选择。 * 文件内容示例:(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 ... 
+1

我想要中奖彩票号码,但这并不能实现。您将需要扫描整个文件,直到达到DATA END。可能的方法是读取每行或grepping。 Head不会帮助你,因为它只显示文件的顶部x行而不考虑内容 – Anigel

+0

好的。任何可能最快的php解决方案都是受欢迎的。我在windows上无法使用grep。 – django

+0

增加php服务器执行时间 –

回答

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(); 
} 
+0

让我们假设数据是在文件的开始?然后怎样呢 ?如果我没有其他选择,我也可以让这些数据出现在文件顶部。 – django

+0

@django我改变了我的回答 –

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静态函数来完成你需要做的任何事情。

+0

+1,因为SplFileObject实际上有一个方法来获得一个特定的行:http://php.net/manual/en/splfileobject.seek.php – AVProgrammer

0

你有没有尝试过这样的:

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

不好意思,刚才注意到一个评论,你是在Windows上。我猜想必须有一个Windows版本grep,这可能是值得研究的。

0

我想我将不得不依赖像grep linux(针对windows gnu32) 这样的外部工具来满足我的特定需求,因为根据我的理解,在php上有更好的性能。

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

+0

它可以工作,如果文件被新线。如果没有新行,它只会转储整个文件。顺便说一句,我同意,grep更快。 – imel96

+0

我有数据换行 – django

+0

看看这个SO线程然后:http://stackoverflow.com/questions/87350/what-are-good-grep-tools-for-windows – Tigger

0

grep的一个Windows equivlant是findstr:

搜索文件中的字符串。

findstr