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) 

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


Song_   (2002-11-22 10:42:00) [41]

Separator ©,
Я не хочу выбирать путь публичного унижения кого бы это ни было на этой конференции, как это сделал ProgMan, поэтому программа (~5 кб) направлена на Ваш почтовый ящик.


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

Кстати Song, а вы проверяли свое решение? Я вот взял ваш код и ничего не исправляя вставил в дельфи и каков результат? Ничего не работает, точней не совсем работает.
Чтоб избежать последуюзей дискусси вот код:

const
StandartDelimiters: array [1..17] of Char = (" ", "!", "@", "(", ")", "-", "|", "\", ";", ":", """, "/", "?", ".", ">", ",", "<");
var
t: integer;
begin
ListBox2.Items.Clear;
For t:=0 to High(StandartDelimiters)-1 Do
ListBox2.Items.Text:=StringReplace(ListBox1.Items.Strings[ListBox1.ItemIndex],StandartDelimiters[t],#13#10,[rfReplaceAll]);
end;


Результат на строку "Наступит утро, и свои" таков:
Наступит утро
и свои

Результат на строку "В миг лепестки распустит роза..." таков:
В миг лепестки распустит роза...

т.е. без изменений, может я что-то не так делаю?


Song_   (2002-11-22 10:23:00) [43]

Сказав "Ты с Паскаля вырос что ли?" я имел ввиду, что человек предоставил решение полностью на конструкциях языка без использования возможностей, которые дают некоторые классы. И уж никак я не хотел кого-либо обидеть. Только Вы увидели в моих словах пренебрежение. Если Вы не знаете как использовать CommaText могу рассказать. Separator"у это не надо, я уверен, что он знает как это делать.
Заметьте я не пальцевал, а указал на более простое и рациональное решение, пальцуете как раз Вы, намекая на какое-то минимое различие между людьми на этом форуме посредством значка.
Насчёт ты-Вы, это проиходит не осознанно, и источники этого, без сомнения, я объяснять не буду.

>>Чем не угодил Паскаль Мастеру Delphi?
С паскалем всё Ok. Что я имел ввиду я написал выше.

>>два разделителя подряд?
Давайте мы поищем ещё кучу условностей. Три разделителя подряд? Пять, десять? Ещё чего-нибудь? Я имею ввиду, что если закрыть эту условность, то можно найти ещё с десяток, а это уже качество ведения б/д. См. Song © (22.11.02 09:00)


ProgMan   (2002-11-22 10:13:00) [44]

>>Ты с Паскаля вырос что ли?
>>CommaText и более ничего не надо :-)

Это не готовое решение, а совет по направлению решения.
Чувствуете разницу?

А это уже готовое решение (Ваше):
const StandartDelimiters: array of Char = [" ", "!", "@", "(", ")", "-", "|", "\", ";", ":", """, "/", "?", ".", ">", ",", "<"];

For t:=0 to High(StandartDelimiters)-1 Do Text:=StringReplace(Text,StandartDelimiters[t],#13#10,[rfReplaceAll]);
ShowMessage("В файле "+IntToStr(объект.Count)+ "слов.")


Но Вы его предложили позже, уже в процессе дискуссии, а начали с распальцовки. Вот я о чем...

Так насчет других замечаний?
ты-Вы?
Чем не угодил Паскаль Мастеру Delphi?
два разделителя подряд?


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

Я его предложил. У меня разделение идёт одной строкой. У меня оно тоже готовое.


Дмитрий К.К.   (2002-11-22 09:59:00) [46]

ProgMan прав.


ProgMan   (2002-11-22 09:52:00) [47]

>>Song ©
А теперь сами сравните 2 ответа:
Song © (22.11.02 08:26)
и
Song © (22.11.02 09:27)

Спор ни о чем.
Если у Вас более красивое решение - предложите.
На то Вы и Мастер.
Separator © предложил готовое решение, а Вы начали "пальцевать":
>>Ты с Паскаля вырос что ли?А Вы не пользуетесь Паскалем в Delphi? :-)
Через час "ты" сменилось на "Вы"...
>>Ваша громоздкая ф-ия не нужна

Кстати, а как насчет двух разделителей подряд?


Song   (2002-11-22 09:27:00) [48]

const StandartDelimiters: array of Char = [" ", "!", "@", "(", ")", "-", "|", "\", ";", ":", """, "/", "?", ".", ">", ",", "<"];

For t:=0 to High(StandartDelimiters)-1 Do Text:=StringReplace(Text,StandartDelimiters[t],#13#10,[rfReplaceAll]);
ShowMessage("В файле "+IntToStr(объект.Count)+ "слов.")

Я про то, что Ваша громоздкая ф-ия не нужна. Ещё спорить будете?


Separator   (2002-11-22 09:21:00) [49]

А если допустим тест такой: "Это текст!Который надо разбить на слова."
Результат будет такой:
Это
текст!Который
надо
разбить
на
слова.

А результат моей функиции будет такой:
Это
текст
Который
надо
разбить
на
слова


Song   (2002-11-22 09:00:00) [50]

2MBo © (22.11.02 08:33)
Бывает какой-нибудь один разделитель, а два: и запятая и пробел - редко, это уже не БД получается, а какая-то ерунда, составленная очень неряшливо.

2Separator © (22.11.02 08:34)
>>ДА???? Он не всегда правильно резделяет
Ну хорошо не нравится CommaText используй это:

Text:=StringReplace(Text,#32,#13#10,[rfReplaceAll]);

разделит как надо.


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


> CommaText и более ничего не надо :-)

ДА???? Он не всегда правильно резделяет


MBo   (2002-11-22 08:33:00) [52]

>Song
Все-таки у него не только по запятым и пробелам делит


Song   (2002-11-22 08:26:00) [53]

2Separator © (22.11.02 07:49)
Ты с Паскаля вырос что ли?
CommaText и более ничего не надо :-)


valerchik   (2002-11-22 08:06:00) [54]

Спасибо мужики.
Ща буду тестить все то что посоветовали :)
Вообще дело все в том...надо чтоб работало как можно быстрее.


Separator   (2002-11-22 08:05:00) [55]

Забыл. Нужно еще добавить вначале:

type
TDelimiter = set of #0..#255;


Separator   (2002-11-22 07:49:00) [56]

Во посмотри, мжет чего и найдешь нужного:

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

function StringToWords(const DelimitedText: string; ResultList: TStrings; Delimiters: TDelimiter = []; ListClear: boolean = true): boolean;
var
i, Len, Prev: word;
TempList: TStringList;

begin
Result:= false;
if (ResultList <> nil) and (DelimitedText <> "") then
try
TempList:= TStringList.Create;
if Delimiters = [] then
Delimiters:= StandartDelimiters;
Len:= 1;
Prev:= 0;
for i:= 1 to Length(DelimitedText) do
begin
if Prev <> 0 then
begin
if DelimitedText[i] in Delimiters then
begin
if Len = 0 then
Prev:= i + 1
else
begin
TempList.Add(copy(DelimitedText, Prev, Len));
Len:= 0;
Prev:= i + 1
end
end
else
Inc(Len)
end
else if not (DelimitedText[i] in Delimiters) then
Prev:= i
end;
if Len > 0 then
TempList.Add(copy(DelimitedText, Prev, Len));
if TempList.Count > 0 then
begin
if ListClear then
ResultList.Assign(TempList)
else
ResultList.AddStrings(TempList);
Result:= true
end;
finally
TempList.Free
end
end;

function StringsToWords(const DelimitedStrings: TStrings; ResultList: TStrings; Delimiters: TDelimiter = []; ListClear: boolean = true): boolean;
begin
if Delimiters = [] then
Delimiters:= StandartDelimiters + [#13, #10]
else
Delimiters:= Delimiters + [#13, #10];
Result:= StringToWords(DelimitedStrings.Text, ResultList, Delimiters, ListClear)
end;


Дмитрий К.К.   (2002-11-22 07:30:00) [57]

Ежели антиресует подсчет количества слов в строке, то вот ссылочка: http://delphibase.endimus.com/?action=viewfunc&topic=strmath&id=10086


Anatoly Podgoretsky   (2002-11-21 22:28:00) [58]

Создай список разделителей, остальное дело техники, просто сканирование, С точками только сложность, двоякая у них природа, то часть слова, то разделитель, но можно это отнести к погрешности подсчета.


MBo   (2002-11-21 22:22:00) [59]

Сначала определи, что считать словом, как они разделяются, потом по эти разделителям и выбирай слова


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

Наверх

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