Текущий архив: 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