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-22 15:01:00) [21]

Кто знает как подсчитать количество разных слов. Ну что-то вроди этого :

вася 5
купил 23
нашел 2


Song   (2002-11-22 12:55:00) [22]

Separator © (22.11.02 12:50)
Трассировкой пройди :-))


Separator   (2002-11-22 12:50:00) [23]

Ну так это маленький текст, я подсунул ему тексты нескольких песен Ramstein, если надо могу их привести. Моя функция выдает 1804 слова, а эта функция выдает 1803


Игорь Шевченко   (2002-11-22 12:40:00) [24]

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt("Слов: %d", [WordCount(Memo1.Lines.Text, [" ",","])]);
end;

Содержимое мемо:
"А текст приводит бесполезно, я просто запихал в ListBox несколько текстовых файлов, короче просто набор слов".

Результат - 16


Separator   (2002-11-22 12:39:00) [25]

Ошибка.
i := WordCount(ListBox1.Items.Text, spUtils.StandartDelimiters);


Separator   (2002-11-22 12:33:00) [26]

type
TCharSet = set of Char;

var
StandartDelimiters: TCharSet = [" ", "!", "@", "(", ")", "-", "|", "\", ";", ":", """, "/", "?", ".", ">", ",", "<"];


function WordCount(const S: string; const WordDelims: TCharSet): Integer;
var
SLen, I: Cardinal;
begin
Result := 0;
I := 1;
SLen := Length(S);
while I <= SLen do begin
while (I <= SLen) and (S[I] in WordDelims) do Inc(I);
if I <= SLen then Inc(Result);

while (I <= SLen) and not(S[I] in WordDelims) do Inc(I);
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
i: integer;

begin
i := WordCount(ListBox1.Items.Strings[ListBox1.ItemIndex], spUtils.StandartDelimiters);
ShowMessage(IntToStr(i));
end;

А текст приводит бесполезно, я просто запихал в ListBox несколько текстовых файлов, короче просто набор слов


Игорь Шевченко   (2002-11-22 12:16:00) [27]

Separator © (22.11.02 11:58)

Текст и вызов функции в студию ? :-)


Separator   (2002-11-22 11:58:00) [28]


> Игорь Шевченко © (22.11.02 11:40)
Не знаю конкретно в чем дело, но у меня в тексте 2253 слова WordCount выдает 2230, функция Song и моя функция выдают 2253


Игорь Шевченко   (2002-11-22 11:42:00) [29]

Дла файла "любого размера" аналогичная процедура делается через FileMapping и замену String в функции на PChar...


Separator   (2002-11-22 11:41:00) [30]


> Anatoly Podgoretsky © (22.11.02 11:33)

Полностью согласен, я не доглядел.


Игорь Шевченко   (2002-11-22 11:40:00) [31]

RXLib, однако...


function WordCount(const S: string; const WordDelims: TCharSet): Integer;
var
SLen, I: Cardinal;
begin
Result := 0;
I := 1;
SLen := Length(S);
while I <= SLen do begin
while (I <= SLen) and (S[I] in WordDelims) do Inc(I);
if I <= SLen then Inc(Result);

while (I <= SLen) and not(S[I] in WordDelims) do Inc(I);
end;
end;


]?°’???   (2002-11-22 11:36:00) [32]

>конкретная строка
ListBox2.Items.Text явно не одна строка


Anatoly Podgoretsky   (2002-11-22 11:33:00) [33]

Separator © (22.11.02 10:47)
Как минимум это, нарушение границ индексов и также это означает, что у тебя отключена проверка диапазона в компиляторе.

StandartDelimiters: array [ 1..17] of Char =

For t:= 0to High(StandartDelimiters)-1 Do

Надо

For t := Low(StandartDelimiters) to High(StandartDelimiters) Do

У Song объявлено array of Char, а у тебя array [1..17]
У него тоже мелкая ошибка High(StandartDelimiters)-1 не отработает разделитель "<", а у тебя серьезная.
Мораль: не выключай проверку диапазона или совсем или пока полностью не отладишь программ и не научишься писать безопасный код, в данном случае это использование Low и High

Для борьбы с множественным разделителями, надо после развиения удалить пустые строки из списка

P.S. И хотелось бы, что бы дисккуссии велись прилично, без переходов на личности, не добавляйте работы модераторам.


Separator   (2002-11-22 11:32:00) [34]


> ]?°’??? (22.11.02 11:18)

Просто я хотел, чтоб разбивалась конкретная строка, а не весь текст.


> Song © (22.11.02 11:17)
Не знаю как все, но я прежде чем использовать взятый где-либо код полностью разбираюсь как он работает. Кстати мой метод работает на порядок быстрее :)


]?°’???   (2002-11-22 11:18:00) [35]

>Separator © (22.11.02 10:47)
>А лучше напишите в данном форуме, что я сделал неправильно?


For t:=0 to High(StandartDelimiters)-1 Do
ListBox2.Items.Text:=StringReplace(ListBox1.Items.Strings[ListBox1.ItemIndex],StandartDelimiters[t],#13#10,[rfReplaceAll]);

просто индекс списка тут ни при чем, нужно было так

ListBox2.Items.Text:=StringReplace(ListBox1.Items.Text,StandartDelimiters[t],#13#10,[rfReplaceAll]);


Song   (2002-11-22 11:17:00) [36]

Я предпочитаю, чтобы люди учились программировать, а не брали всё готовое. Поэтому лучше дать человеку научиться, чем сразу ему дать работающий код. Последний он вставит в программу и забудет даже про него, не говоря уж о том, чтобы разобраться чего он делает. Это я Вам говорю по опыту.

>>..так даже простая описка приведет к хотя бы к тому, что вас будут считать не компетентным.
Это вряд ли. Но у Вас может быть своё личное мнение.


Separator   (2002-11-22 11:11:00) [37]

Вот ваш код:

procedure TForm1.Button1Click(Sender: TObject);
Const StandartDelimiters: array [1..17] of Char = (" ", "!", "@", "(", ")", "-", "|", "\", ";", ":", """, "/", "?", ".", ">", ",", "<");
Var t:Integer;
Str:TStringList;
begin
Str:=TStringList.Create;
With Str Do
try
Text:=Edit1.Text;
For t:=1 to 17 Do Text:=StringReplace(Text,StandartDelimiters[t],#13#10,[rfReplaceAll]);
For t:=Count-1 downto 0 Do IF Trim(Strings[t])="" then Delete(t);
Memo1.Lines.Assign(Str);
ShowMessage("В строке "+IntToStr(Count)+ " слов.");
finally
Free;
end;
end;


Он работет правильно. Вот так и надо было сразу писать. И честно говоря перед тем, как что-либо выложить на форум НАДО проверять на работоспособность, так даже простая описка приведет к хотя бы к тому, что вас будут считать не компетентным.


unreger   (2002-11-22 11:06:00) [38]

Что-то подобное такой задаче делается и у меня, но все, что найдется, должно попасть в базу данных для последующей обработки (морфология, синтаксис, поиск границ предложения и проч.)

Правило такое: все что цифробуква = слово, иначе = псевдослово (набор разделителей)
Делает это IsCharAlphaNumeric. Два буфера. TFileStream.
Посимвольное считывание (тут пока не разбирался, но если поток не оптимизирует это дело, то можно будет и свой написать). Как только последовательность цифробукв меняется на последовательность разделителей => в первом буфере собрали слово. Можно считать это еще одним вариантом. И красиво подсвечивать в RichEdit ход анализа.


Song   (2002-11-22 10:53:00) [39]

Выслал.
>>что я сделал неправильно
Не знаю. У меня всё работает.
Вообще я редко тестирую в самой Дельфи, то что отвечаю в форуме и не из-за того, что "зазнался", а из-за то, что времени не хватает. Но в этот раз я это сделал. Результат перед Вами в письме.


Separator   (2002-11-22 10:47:00) [40]


> Song_ (22.11.02 10:42)
Просьба если сможешь, то вышли эту программу на vilgelm@mail.kz
А лучше напишите в данном форуме, что я сделал неправильно?


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

Наверх

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