Коллеги, есть ли какие-нибудь исходники по обработке текстовых файлов. Обработка блоков тестков разделенных набором символов. Поиск слов (словосочетаний) в этих блоках. Подсчет частоты встречаемости. Работа с лексемами и т.д. Жду Ваших предложений
Есть текстовый файл с текстом, состоящием из отдельных блоков, разделенных набором символов, например следующей последовательностью: **??**. Необходимо составить словарь (список в отдельном текстовом файле) слов и словосочетаний (последовательности слов) всего текста и каждого блока в отдельности с указанием частоты встречаемости. Желательно иметь возможность создания лексем. В частности под механизмом создания лексемы я понимаю мехнизм нахождения в тексте слов, имеющих одинаковую подпоследовательность символов мощности >N и отличающихся от этой подпоследовательности на <<N символов.
Я не знаю, что именно ты задумывал в этой программе, и какие у тебя были файлы данных, но с моими файлами она в 2-х местах входила в бесконечный цикл: 1) в процедуре file_preprocess замени
while not eof (f) do begin {1}
на
while not seekeof (f) do begin {1}
2)
while j<=i do begin {2} if bufer[j]<>'' then begin {3} stroka:=bufer[j]; for k:=1 to i do begin {4} if stroka=bufer[k] then begin
Ну, так что, мы по прежнему должны ДОГАДЫВАТЬСЯ, что именно у тебя хранится в файле данных? Или ты уже научишься, задавая вопрос, присоединять не только (и не столько) программу, но и файл данных? Я же сказал, что с моим файлом все отработало, значит проблема - в твоем DATA.TXT...
И ты хочешь сказать, что при запуске программы с моими исправлениями у тебя нет результирующих файлов (или они пустые?)... Очень интересно. Тогда посмотри, что получилось у меня (результ. файлы) - и заодно попробуй у себя запустить программу (test.pp).
Мне почему-то кажется, что у тебя какая-то проблема с опциями компилятора
if (ORD(symb)>=65) and (ORD(symb)<=90) OR (ORD(symb)>=97) and (ORD(symb)<=122) then begin {33} if (ORD(symb)>=65) and (ORD(symb)<=90) then write (res, chr(ord(symb)+32)) else write (res, symb); end {33} else begin {11} if (ORD(symb)=38) then write (res, symb) else begin {22} writeln (res); {writeln (res, symb);} end; {22}
end; {11}
end; {2} readln (sourf); writeln(res); end; {1} close (sourf); close (res); end; {0}
{===========================================================} { Выделение всех уникальных элементов в массиве } { (создание частотного словаря текста) } {===========================================================}
procedure create_vocabulary (file1_:string);
var bufer: array[1..7000] of string [30]; {Здесь у меня ПРОБЛЕМА. ЧТО можно сделать чтобы можно было поставить, например, 100 000???}
Я еще в посте №7 сказал, что это надо было сделать... Без этого программа входит в бесконечный цикл...
По поводу 8000 элементов: ты наступаешь второй раз - на те же грабли Вынеси описание
const max_count = 100000; var bufer: array[1..max_count] of string [30];
из процедуры и сделай этот массив глобальным, у тебя просто не хватает стека, чтобы затолкать в него больше 3-х Мб данных (если массив описан локально)... У меня прекрасно отработало при
max_count = 100000;
, но на всякий случай счетчики i, j, k я сделал типа LongInt ...