【问题标题】:Search for a phrase in a .txt file with PHP使用 PHP 在 .txt 文件中搜索短语
【发布时间】:2015-10-26 23:28:54
【问题描述】:

我有一个巨大的文件,其中有几行数据(长度几乎相同)。我想浏览它们并找到某个单词的每一次出现,然后取出该单词出现的整行并将其回显到屏幕上。目前我正在使用这种方法:

$result_counter = 0;
$result_array[1] = 'No results';

$search_slug = $request->input('search_slug');
$fp = fopen(base_path('storage\app\xas.txt'), "r");

while (false !== ($line = fgets($fp))) {
    // Process $line, e.g split it into values since it is CSV.

    $exploded = explode('-', $line);
    $exploded = implode('', $exploded);
    set_time_limit(30);
    if(strpos($exploded, strtoupper($search_slug))) {
        $result_counter++;
        $result_array[$result_counter] = $exploded;
    }
}
return view('results')->with(array('results' => $result_array, 'query' => $search_slug));
fclose($fp);

逐行浏览一个巨大的文件需要很长时间。

您可能会问 - 为什么不使用 MySQL?

这是一个很大的问题 - 我的文件有 250 万行长,而且很快可能会更大。如果我尝试一次更新数据库,我的服务器的所有者将禁止我的帐户,更不用说人们将每小时查询大部分内容的事实。我也买不起“无限制”服务器。我会尽快迁移到 MySQL,但现在我需要一个快速的解决方案。

如何使用 PHP 解决这个问题?有没有办法在文件中搜索单词出现然后只抓取这些行?

【问题讨论】:

  • 我会使用一个实际的可搜索索引,如 Lucene(或任何现代等价物)。这里有一些提示~stackoverflow.com/questions/2010663/lucene-with-php
  • 可能是对grep的系统调用?
  • “如果我尝试一次性更新数据库,我的服务器所有者将禁止我的帐户,更不用说人们会每小时查询大部分内容。”据推测,如果您要切换到数据库,您应该只需要更新数据库一次,然后only从那里使用数据库。如果您正确地组织和索引您的表,您的查询应该只需几毫秒即可执行。
  • 没关系,彼得,我们都必须从某个地方开始!我个人使用Vultr,但您有多种选择,例如Digital Ocean。这样,您可以随着数据库的增长简单地扩展您的解决方案!但正如@Mike 再次所说,如果索引正确,您的查询应该需要几毫秒。 (使用 VPS 可以让您成为“所有者”,因此您可以规避由此产生的任何问题)
  • 其他人所说的:正确地indexed 表可能需要几毫秒才能更新。在我来到这里之前,我在不到 10 秒的时间内完成了一个包含 15+ 百万行的表的更新;x

标签: php csv


【解决方案1】:

您可以使用像这样的正则表达式^.*yourword.*$.

资源:http://www.regular-expressions.info/completelines.html

【讨论】:

  • 我使用正则表达式还是strpos都没有关系。这不是我的问题,我的问题是浏览文件时的速度。
  • 感谢您的投票,“使用 PHP 在 .txt 文件中搜索短语”还有“我想浏览它们并找到每一个出现的某个词,"
  • 我怀疑瓶颈来自循环文件。请参阅我上面的评论。
猜你喜欢
  • 2019-09-07
  • 2019-08-27
  • 1970-01-01
  • 2016-09-29
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多