4

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

然而,此块可能出现在开始文件的,位于结束或在中之间文本文件。我希望这个阅读过程快一些。假设它是在文本文件的开头,那么它应该和linux-head一样快,对于大文件来说,它花费的时间非常少。

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

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

虚拟文本虚拟文本虚拟文本虚拟文本**数据输入**d日**e(电子)**(f)**克**数据结束虚拟文本虚拟文本虚拟文本等等。。。

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

**数据输入**d日**e(电子)**(f)**克**数据结束虚拟文本虚拟文本虚拟文本虚拟文本虚拟文本伪文本等等。。。
6
  • 1
    我想要中奖号码,但这不可能。您需要扫描整个文件,直到到达DATA END。可能的方法是读取每一行或重新绘制。Head不会帮助您,因为它只显示文件的前x行,而不考虑内容 评论 2013年8月2日6:23
  • 好的。欢迎使用任何最快的php解决方案。我在窗户上,所以不能使用grep。
    – 让戈
    评论 2013年8月2日6:28
  • 增加php服务器的执行时间 评论 2013年8月2日6:29
  • 在Windows中有一个叫做“findstr”的命令,你试过了吗?它相当于“grep”。 评论 2013年8月2日6:30
  • 似乎grep适用于windows。gnuwin32.sourceforge.net/packages/grep.htm
    – 让戈
    评论 2013年8月2日6:44

5个答案5

重置为默认值
2

使用SplFileObject类。

首先使用SplFileObject::fgets以:

返回包含文件中下一行的字符串,出错时返回FALSE。

有点像这样

$file=新SplFileObject(“file.txt”);while(!$file->eof()){$line=$file->fgets();如果($line===‘针’)断裂;}

然后您可以使用$计数器变量to作为包含针的行的参考。在那之后,获得你想要的信息就变得很简单了。想要检索该行吗?还是之后的整个文档?还是之前?到这里使用SplFile对象静态函数来执行其他需要执行的操作。

1
0

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

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

如果要提取文本:

$file=新SplFileObject(“file.txt”);$lines=array();while(!$file->eof()){$line=$file->fgets();if($line==='**DATA IMP')断裂;}$line=$file->fgets();while($line!='**DATA END'){$lines[]=$line;$line=$file->fgets();}
2
  • 假设数据位于文件开头?然后呢?如果没有其他选项,我也可以使此数据显示在文件顶部。
    – 让戈
    评论 2013年8月2日6:29
  • @django我改了答案 评论 2013年8月2日6:38
0

您是否尝试过以下操作:

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

抱歉,刚在评论中注意到你在Windows上。我想一定有Windows版本的格雷普,这可能值得研究。

0

我认为我必须依赖外部工具,如grep-linux(用于windows)gnu32型) 根据我的理解,对于我的特定需求,它比php具有更好的性能。

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

  • 如果文件被新行打断,它可能会起作用。如果没有换行符,则只转储整个文件。顺便说一句,我同意,grep更快。
    – imel96型
    评论 2013年8月2日6:53
  • 我在数据中有新行
    – 让戈
    评论 2013年8月2日6:58
  • 看看这个SO线程,然后:stackoverflow.com/questions/87350/…
    – 跳跳虎
    评论 2013年8月2日8:18
0

与grep等价的Windows是findstr:

在文件中搜索字符串。

查找字符串

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.