Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подсчет слов в файле !!! [D4, Win2k]


Страницы:   1 2 3

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), если такое слово уже есть


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо