Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.05;
Скачать: CL | DM;

Вниз

Подсчет слов в файле !!!   Найти похожие ветки 

 
MBo ©   (2002-11-22 15:04) [40]

Заноси их в сортированный StringList, инкрементируя Integer(Objects), если такое слово уже есть


 
Song ©   (2002-11-22 15:09) [41]

2valerchik (22.11.02 15:01)
http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=flame;action=display;num=1036515976;start=1


 
valerchik   (2002-11-22 15:26) [42]

Если делать через массив то долго получается прога работает если файл метров 50


 
Song ©   (2002-11-22 15:39) [43]

Я думаю, это самый быстрый способ. Если делать вложенный цикл и цикл куда будешь заность уже найденные - будет ещё дольше.


 
Alex44   (2002-11-22 16:26) [44]


> Кто знает как подсчитать сколько каких слов содержиться
> в файле любого размера ?


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"...


 
Игорь Шевченко ©   (2002-11-22 16:34) [45]

Да хоть 4 Гб и за один проход. Какая разница-то ? Считать надо не слова, а последовательности разделителей


 
MegaBass ©   (2002-11-22 16:54) [46]

А не считаете ли вы, что перед тем как учиться писать рограммы, надо выучиться грамматически правильно писать текст ?


 
Yegor Derevenets   (2002-11-22 16:55) [47]

Вообще, вряд ли найдется алгоритм, обрабатывающий файл в 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. Можно еще написать через файловый поток, почитать Кормена, найти там что нибудь подобное (или Кнута!) и написать...


 
valerchik   (2002-11-22 21:25) [48]

> Заноси их в сортированный StringList, инкрементируя Integer
>(Objects), если такое слово уже есть
Это как ? Хотелось бы посмотреть код программы...


 
MBo ©   (2002-11-23 13:38) [49]

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-го слова в текст.

Замечу, что при очень большом количестве слов быстрее будет работать метод хэширования.




 
MBo ©   (2002-11-23 13:58) [50]

Пардон, ветка else должна быть такой:
else
List.AddObject(s,Pointer(1));


 
valerchik   (2002-11-23 15:01) [51]

Чёт не работает.
я вот чё делаю:(считываю слова из файла и пытаюсь запихнуть их в массив)

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 15:12) [52]

где у тебя создание объекта списка????

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 16:43) [53]

спасибо....ща попробую........


 
valerchik   (2002-11-23 17:36) [54]

Вроди все работет :) Спасибо всем :)


 
valerchik   (2002-11-27 10:20) [55]

Пацаны....выручайте...Надо чтоб по-шустрее работало...
Долго он разбивает текст на слова и подсчитывает сколько каких слов было использовани....


 
Mad_Ghost ©   (2002-11-27 10:40) [56]

гы, а че ещё не в курсе что есть такой компонент TRegExpr, или вы с регулярными выражениями не работали?
это же самый рулезный метод обработки текстовых данных, и аналога ему нету.
r: TRegExpr;

r := TRegExpr.Create;
r.Execute := "\S+";
r.Exec(S); //S - текст
for i := 0 to ... до чего до конца, /
r.NextExec; // или че то подобное ... ща точно не помню.
end;
смысл в том чтобы выделять из текста по слову.
выделить слово \S+ , по моему так, хотя сам не пробовал.


 
Smithson ©   (2002-11-27 10:54) [57]

Сформулируй еще раз задачу. Тебе предложили решение, при котором ты получаешь максимум информации из файла. Если тебе надо подсчитать только количество слов (итого), то просто читаешь построчно файл и подсчитаваешь количество разделителей, считая группу разделителей одним. Никакого списка уже не надо и такой код тут уже был.
А если нужна полная статистика, то про скорость можно забыть - аналитика всегда тормоза.


 
valerchik   (2002-11-27 11:26) [58]

Вобщем задача такая....подсчитать сколько раз в тексте использовались слова...
Ток надо самый шустрый метод..скорость очень важна...рабоатть буду с файлами большого объема...


 
valerchik   (2002-11-27 11:49) [59]

А чё за TRegExpr я про такое не слыхал...
Даже не могу врубиться, как он работает...



Страницы: 1 2 вся ветка

Текущий архив: 2002.12.05;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.019 c
3-14464
Kurt
2002-11-18 18:05
2002.12.05
Не подскажите а можно ли передовать 2 папраметра из главной


4-14888
valeryM
2002-10-23 15:53
2002.12.05
Минимизация модальной формы


1-14599
Юлия
2002-11-24 13:08
2002.12.05
Отмена действия


1-14541
tv
2002-11-26 18:03
2002.12.05
Плоский TTreView.


14-14724
Bboy tn
2002-11-12 19:08
2002.12.05
Age Of Wonders II