Проанализируйте текстовый файл с помощью PHP и сохраните смещение каждого слова

#php #parsing #text

#php #синтаксический анализ #текст

Вопрос:

Я пытаюсь разобрать текстовый файл слово за словом, и мне нужно иметь возможность сохранять смещение каждого слова от начала файла, чтобы затем я мог найти точный экземпляр слова в текстовом файле. Сейчас я имею дело с некоторыми очень большими текстовыми файлами, поэтому мне было интересно, каков наиболее эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Еще несколько деталей.

У меня будет две таблицы в базе данных. Давайте назовем их WORDS, в которых хранятся слова и ССЫЛКИ, которые являются ссылкой для каждого слова на файл.

Таблица ССЫЛОК будет выглядеть примерно так:

 id INT PRIMARY
file_id INT /* ID of the text file */
offset INT /* Offset from the start of the file to get to the start of the word */
  

Тогда каждая запись СЛОВ имеет referenced_id, который связан с записью в ССЫЛКАХ.

Это упрощенный пример. На самом деле у меня будет другая таблица, которая связывает каждую запись из СЛОВ с одной или несколькими записями в ССЫЛКАХ, поскольку во многих файлах может быть много экземпляров каждого слова.

Цель всего этого — иметь возможность точно показывать, где были найдены экземпляры слова при поиске. Поэтому, когда я нахожу слово, я могу получить ссылку на него, а затем взять выдержку из текстового файла.

Комментарии:

1. действительно зависит от последующего использования, пожалуйста, расширьте вопрос. приведите пример.

2. PHP не предназначен для обработки очень больших файлов. Сделайте его асинхронным, выберите другой язык, такой как C, Python или Perl, и вызовите анализатор из PHP.

Ответ №1:

наиболее эффективно по времени или по используемой памяти?

  1. По времени — загрузите весь файл в память и проанализируйте его. А затем всплываем каждое слово, сохраняя его длину (word)

$page = file_get_contents( $file); $arr_w = explode( » «, $page);

$arr_c = array(); количество слов $ arr_o = array(); смещение слов 🙂

$c = 0; foreach ($arr_w как $ w) { $c ; str_replace( $page, $ w, «», 1); $arr_c [$w] ; $arr_o [$ c] = strlen($ w) 1; }

Это просто идея…

  1. Из-за использования памяти — вам потребуется постоянно читать файл и анализировать. Это сильно отличается от этого примера …