2015-10-26 3 views
0

У меня есть ОГРОМНЫЙ файл, в котором есть строки данных (в значительной степени одинаковой длины). Я хотел бы просмотреть их и найти каждое происхождение определенного слова, а затем взять всю строку, где это слово произошло, и вывести его на экран. В настоящее время я использую этот метод:Поиск фразы в TXT-файле с PHP

$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?

Существует огромная проблема с этим - мой файл составляет 2,5 миллиона строк в длину и может быть еще большим. Владелец моего сервера запретит мою учетную запись, если я попытаюсь обновить базу данных за один раз, не говоря уже о том, что люди собираются запрашивать большие ее части ежечасно. Я также не могу позволить себе «безграничный» сервер. Я перейду к MySQL, как только это станет возможно, но сейчас мне нужно быстрое решение.

Как решить эту проблему с помощью PHP? Есть ли способ поиска слов в файле, а затем захват только этих строк?

+2

Я хотел бы использовать фактический поисковый индекс, как Lucene (или любой другой современный эквивалент). Некоторые подсказки здесь ~ http://stackoverflow.com/questions/2010663/lucene-with-php – Phil

+0

О, я не знал этого, спасибо за подсказку, я исследую его. –

+3

Может быть системный вызов 'grep'? – fpierrat

ответ

0

Вы можете использовать регулярные выражения, как этот ^.*yourword.*$.

Ресурс: http://www.regular-expressions.info/completelines.html

+0

Не имеет значения, использую ли я регулярное выражение или strpos. Это не моя проблема, моя проблема в скорости при просмотре файла. –

+0

Спасибо за downvoting, «* Ищите фразу в .txt-файле с PHP *« также »* Я хотел бы просмотреть их и найти каждое появление определенного слова, *« –

+0

У меня есть сомнения в том, что узкое место от цикла по файлу. См. Мой комментарий выше. – Mike

Смежные вопросы