我有一组文件大小非常大的文本文件。
我不想阅读整个文件。我只对以** 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 ...
答案 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)