![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсчет слов в файле !!! [D4, Win2k]
valerchik © (2002-11-21 22:20:00)Кто знает как подсчитать сколько каких слов содержиться в файле любого размера ? Как организовать цикл выделения слов из строки текста..........
valerchik (2002-11-27 11:49:00) [1]А чё за TRegExpr я про такое не слыхал...
Даже не могу врубиться, как он работает...
valerchik (2002-11-27 11:26:00) [2]Вобщем задача такая....подсчитать сколько раз в тексте использовались слова...
Ток надо самый шустрый метод..скорость очень важна...рабоатть буду с файлами большого объема...
Smithson (2002-11-27 10:54:00) [3]Сформулируй еще раз задачу. Тебе предложили решение, при котором ты получаешь максимум информации из файла. Если тебе надо подсчитать только количество слов (итого), то просто читаешь построчно файл и подсчитаваешь количество разделителей, считая группу разделителей одним. Никакого списка уже не надо и такой код тут уже был.
А если нужна полная статистика, то про скорость можно забыть - аналитика всегда тормоза.
Mad_Ghost (2002-11-27 10:40:00) [4]гы, а че ещё не в курсе что есть такой компонент TRegExpr, или вы с регулярными выражениями не работали?
это же самый рулезный метод обработки текстовых данных, и аналога ему нету.
r: TRegExpr;
r := TRegExpr.Create;
r.Execute := "\S+";
r.Exec(S); //S - текст
for i := 0 to ... до чего до конца, /
r.NextExec; // или че то подобное ... ща точно не помню.
end;
смысл в том чтобы выделять из текста по слову.
выделить слово \S+ , по моему так, хотя сам не пробовал.
valerchik (2002-11-27 10:20:00) [5]Пацаны....выручайте...Надо чтоб по-шустрее работало...
Долго он разбивает текст на слова и подсчитывает сколько каких слов было использовани....
valerchik (2002-11-23 17:36:00) [6]Вроди все работет :) Спасибо всем :)
valerchik (2002-11-23 16:43:00) [7]спасибо....ща попробую........
MBo (2002-11-23 15:12:00) [8]где у тебя создание объекта списка????
procedure TForm1.Button1Click(Sender: TObject);
var f:textfile;
s:string;
list:tstringlist;
k:integer;
begin
list:=tstringlist.create;
list.sorted:=true;
assignfile(f,"e:\qqq.txt");
reset(f);
while not eof(f) do begin
readln(f,s);
k:=List.IndexOf(s);
if k>=0 then
List.Objects[k]:=Pointer(Integer(List.Objects[k])+1)
else
List.AddObject(s,Pointer(1));
end;
closefile(f);
for k:=0 to list.count-1 do
Memo1.Lines.Add(list[k]+" "+IntToStr(Integer(list.objects[k])));
list.free;
end;
valerchik (2002-11-23 15:01:00) [9]Чёт не работает.
я вот чё делаю:(считываю слова из файла и пытаюсь запихнуть их в массив)
f2:="c:\MyWords.txt";
assignfile(f1,f2);
reset(f1);
while not seekeof(f1) do
begin
readln(f1,s);
k:=List.IndexOf(s);
if k>=0 then
List.Objects[k]:=Pointer(Integer(List.Objects[k])+1)
else
begin
List.AddObject(s,Pointer(1));
end;
end;
closefile(f1);
MBo (2002-11-23 13:58:00) [10]Пардон, ветка else должна быть такой:
else
List.AddObject(s,Pointer(1));
MBo (2002-11-23 13:38:00) [11]s:string - очередное полученное слово
List:TStringList c Sorted=True
K:=List.IndexOf(s);
if K>=0 then
List.Objects[k]:=Pointer(Integer(List.Objects[k])+1)
else begin
List.Add(s);
List.Objects[List.Count-1]:=Pointer(1);
end;
В таком случае List будет содержать упорядоченный по алфавиту список слов, а Integer(List.Objects[k]) - количество вхождений i-го слова в текст.
Замечу, что при очень большом количестве слов быстрее будет работать метод хэширования.
valerchik (2002-11-22 21:25:00) [12]> Заноси их в сортированный StringList, инкрементируя Integer
>(Objects), если такое слово уже есть
Это как ? Хотелось бы посмотреть код программы...
Yegor Derevenets (2002-11-22 16:55:00) [13]Вообще, вряд ли найдется алгоритм, обрабатывающий файл в 50 мегов достаточно быстро. Вообще - читается файл по строкам и в каждой подсчитывается количество слов. Для подсчета колчества слов в строке можно запустить цикл:
const
Letters=["a".."z", "A".."Z"]; // Добавьте, что не хватает
function WordsAmount (S: string): LongInt;
var
Amount, NChar: LongInt;
LastWasLetter: Boolean;
begin
Amount:=0;
LastWasLetter:=S [1] in Letters;
for NChar:=2 to Length (S)
do begin
if (not (S [NChar] in Letters)) and LastWasLetter
then Inc (Amount);
LastWasLetter:=S [NChar] in Letters;
end;
if LastWasLetter
then Inc (Amount);
WordsAmount:=Amount;
end;
P.S. Я тоже старый (то есть новый) паскалист.
P.P.S. Можно еще написать через файловый поток, почитать Кормена, найти там что нибудь подобное (или Кнута!) и написать...
MegaBass (2002-11-22 16:54:00) [14]А не считаете ли вы, что перед тем как учиться писать рограммы, надо выучиться грамматически правильно писать текст ?
Игорь Шевченко (2002-11-22 16:34:00) [15]Да хоть 4 Гб и за один проход. Какая разница-то ? Считать надо не слова, а последовательности разделителей
Alex44 (2002-11-22 16:26:00) [16]
> Кто знает как подсчитать сколько каких слов содержиться
> в файле любого размера ?
Chto, esli v file 2G? Prosili ne razbit" na slova, a poschitat"kolichestvo! T.e., algorithm dolzhen byt" 1-prohodnyj i bez zagruzki vsego file"a v pamyat"...
Song (2002-11-22 15:39:00) [17]Я думаю, это самый быстрый способ. Если делать вложенный цикл и цикл куда будешь заность уже найденные - будет ещё дольше.
valerchik (2002-11-22 15:26:00) [18]Если делать через массив то долго получается прога работает если файл метров 50
Song (2002-11-22 15:09:00) [19]2valerchik (22.11.02 15:01)
http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=flame;action=display;num=1036515976;start=1
MBo (2002-11-22 15:04:00) [20]Заноси их в сортированный StringList, инкрементируя Integer(Objects), если такое слово уже есть