【问题标题】:Read SELECTED contents from a large text file (varying length text)从大文本文件中读取 SELECTED 内容(可变长度文本)
【发布时间】:2014-01-22 23:34:41
【问题描述】:

我正在寻找读取大文本文件中两个标签之间的文件内容(由于服务器提供商的内存限制,因此无法一次读取整个文件)。这个文件有大约 500000 行文本。

这(PHP: Read Specific Line From File)不是一个选项(我不认为),因为我需要阅读的文本长度不同,并且会占用多行(从 20 到 5000 行不等)。

我打算使用fopenfread(只读)和fclose来读取文件内容。 我已经有使用这些功能的经验了。

我希望读取文件选定部分中的所有内容。

文件内容示例

    <<TAGNAME-1>>AAAA AAAA AAAA<<//TAGNAME-1>>
    <<TAGNAME-2>>TEXT TEXT TEXT<<//TAGNAME-2>>

TAGNAME-1 在我的脚本中作为变量调用时,在&lt;&lt;TAGNAME-1&gt;&gt;&lt;&lt;//TAGNAME-1&gt;&gt; 之间选择文本"AAAA AAAA AAAA"

如何才能选择我需要的两个标签之间的所有文本? (并忽略文件的其余部分) 我有能力在我的 php 脚本中创建两个标签 - 我的问题是在 fread 函数中实现这个。

【问题讨论】:

  • 你有没有尝试解决这个问题? fread() 你有什么具体问题?你能展示你的代码并准确解释什么不能按预期工作吗?
  • 我的问题实际上是能够将fread() 与这些标签一起使用来选择标签之间的文本。我可以得到整个文件的内容(嗯......如果它不是太大......)。我只是不知道如何在读取时实现选择(而不是在将文件读入内存之后)(并且在互联网上找不到任何参考资料)。 - 这就是我遇到的问题。

标签: php file-io tags large-files


【解决方案1】:

你可以 grep 文本文件,它只会返回带有匹配标签的文本。

 $tagnum = 2;     //variable 
 $pattern = "<<TAGNAME-";   
 $searchstr = $pattern.$tagnum;   //concat the prefix with the tag number
 $fpath ="testtext.txt";  //define path to text file
 $result = exec('grep -in "'.$searchstr.'" '.$fpath);
 echo $result;

$tagnum 将定义要搜索的每个标签。我已经在我的沙箱中对其进行了测试,它按预期工作。请注意,这将读取整行,直到到达结尾 tad 或换行符。 问候,

【讨论】:

  • 我可以让它一直工作到$result = exec('grep -in "'.$searchstr.'" '.$fpath); 行 - 这只是一直返回一个空白值。 (当我的脚本和文本文件中存在相同的标签并且文本文件被正确引用时)
  • 阅读这些 cmets(us2.php.net/manual/en/function.exec.php),根据您的系统,如果在 Windows 系统上,您可能需要将整个命令双引号。没有任何额外处理的 $result 应该看起来像 2:&lt;&gt;TEXT TEXT TEXT&lt;&gt; 其中 2: 是行号,后跟文本。 exec( ) 还有一个可以测试的退出状态。
  • exec() 语句中应该有逗号吗?我从来没有用过这个,老实说,我并不真正理解“grep”部分。我是否需要在我的服务器上安装某种形式的插件才能使用它?
  • 不,你不应该需要一个命令。 grep 是一个命令行程序。 exec() 只是执行一个 unix 程序,根据您的设置,使用 grep 可能存在细微差别。 grep 是大多数操作系统的标准配置。从命令行运行man grep 阅读grep 的手册。
  • 如果命令行是指 Windows 命令提示符 - 键入 man grep 会显示它未被识别为命令的消息(如果我理解正确?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多