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

Вниз

поиск слова в тексте и удаление его !!!   Найти похожие ветки 

 
Николай,гер   (2005-06-12 01:23) [0]

Доброго времени суток мне нужна программа которая  бы удаляла слова  
в фаиле , которые присутсвуют там неколько раз. Я тут попытался сам такое написать но оно, как вы уже догодалисьс не работает. Может подскажет кто где здесь  ошибка ?
код :
procedure TForm1.BitBtn1Click(Sender: TObject);
var
text,Stext ,aus   : String;
Mystart, Myend: integer;
Found         : integer;
gk             :TSearchTypes;
textlenge ,i,t     :integer;
begin
text:=Richedit1.Text;
aus:="";

textlenge:= length(text);
for i:=0 to textlenge do

begin
t:=0;
repeat
t:=t+1;
until  (" "= Copy(text,t,1));

stext:= Copy (text, 0 ,t);
aus:=aus+stext+ " ";
text := Copy (text,length(stext),textlenge );
Richedit1.Text:=text;
MyStart:=0;
MyEnd := Length(Richedit1.text);
for mystart:=0 to myend do
begin
Found :=Richedit1.FindText(Stext,MyStart,Myend,gk);
if (Found <>-1 ) then

begin

Richedit1.SelStart:=Found;
Richedit1.SelLength:=Length(Stext);
Delete(Text,Found,Length(Stext));
end;

end;
Richedit2.Text:= aus;
end;
end;


 
Германн ©   (2005-06-12 02:08) [1]

Ну на вскидку.
Позиция 0 в строке всегда (в паскале) имела особое значение. Реально не относящееся к "содержимому строки".


 
ssk ©   (2005-06-12 02:10) [2]

брррр........!
может лучше сделать так?

var
 s: string;

RichEdit1.Lines.LoadFromFile();
s:= RichEdit1.Text;
s := StringReplace();
RichEdit1.Text := s;
RichEdit1.Lines.SaveToFile();


 
Николай,гер   (2005-06-12 10:21) [3]

Спасибо за ответы , но у меня Дельфи на этой фунции StringReplace(); ругатся начинает :)

"[Error] Unit1.pas(93): Not enough actual parameters"

какие параметры я должен ей передавать ?

заранее спасибо


 
Плохиш ©   (2005-06-12 10:43) [4]

>Николай,гер   (12.06.05 10:21) [3]

А посмотреть в справке, какие параметры требует функция StringReplace, ну совсем западло?


 
Николай,гер   (2005-06-12 10:57) [5]

нет не запалдо , просто я английским не владею


 
Alx2 ©   (2005-06-12 11:14) [6]

Заводим отсортированный список "запрещенных" слов. Читаем строчку по словам. Ели очередное слово в списке - читем дальше. Иначе, добавляем слово в список и в результат.


 
Николай,гер   (2005-06-12 11:23) [7]

Да нет там запрещённых слов, в том то и дело . Программа должна сама сравнивать все слова которые там находятся и выкидвать их повторы если таковые имеются.

но всё равно спасибо за совет
Да а как конкретно это зделать ?


 
Alx2 ©   (2005-06-12 11:29) [8]

>Николай,гер   (12.06.05 11:23) [7]

>Да нет там запрещённых слов, в том то и дело .

Запрещенными я назвал слова, чьи повторы имеются.
На первом шаге их нет, конечно. А потом появляются.

Если слово лежит в списке запрещенных, значит оно встречалось ранее и вновь встретится не должно.


 
Alx2 ©   (2005-06-12 11:41) [9]

Например:

 function WordsFilter(const S: string): string;
 const // Множество символов, непрерывная цепочка которых есть слово.
   ValidSet = ["a".."z", "A".."Z", "а".."я", "А".."Я", "0".."9"];
 var SLen: Integer;
   function GetWord(var Idx: Integer; var Dust: string): string;
   var Start: Integer;
   begin
     Result := "";
     Start := Idx;
     // Пропускаем мусор
     while (Idx <= SLen) and not (S[Idx] in ValidSet) do Inc(Idx);
     // Мусор пригодится, так как не сказано, что его надо удалять
     Dust := Dust + Copy(S, Start, Idx - Start);
     Start := Idx;
     // Формируем слово
     while (Idx <= SLen) and (S[Idx] in ValidSet) do Inc(Idx);
     Result := Copy(S, Start, Idx - Start);
   end;
 var
   Idx: Integer;
   Word, Dust: string;
 begin
   Result := "";
   with TStringList.Create do
   try
     Duplicates := dupIgnore;
     CaseSensitive := True;
     Sorted := true;
     SLen := Length(S);
     Idx := 1;
     Dust := "";
     while Idx <= sLen do
     begin
       Word := GetWord(Idx, Dust);
       if IndexOf(Word) < 0 then // Если слово не "запрещенное"
       begin
         Add(Word); // То делаем его запрещенным и дописываем в результат.
         Result := Result + Dust + Word;
         Dust := ""; // Мусор сбрасываем, так как он уже попал в результат.
       end;
     end;
   finally
     Free;
   end;
 end;
begin
 // Пример использования
 ShowMessage(WordsFilter("test test1, test1, alpha, beta beta, gamma"));
end;


 
Николай,гер   (2005-06-12 13:02) [10]

Спасибо это то что надо , с этим буду дальше ковырятся :)


 
Anatoly Podgoretsky ©   (2005-06-12 13:14) [11]

Текст загоняется в StringList - Sorted, Ignore Dups


 
Alx2 ©   (2005-06-12 13:35) [12]

>Anatoly Podgoretsky ©   (12.06.05 13:14) [11]

Получится только в частных случаях.


 
Николай,гер   (2005-06-12 13:43) [13]



var
      SL : TStringList;
 
  text: string;
  td:TDuplicates;

begin
td:=dupIgnore;

SL.Duplicates:=td;


это так выглидит ?
если да то оно не работает :(


 
Николай,гер   (2005-06-12 14:18) [14]

ПАсибо всем я её решил и особое спасибо Anatoly Podgoretsky
вот моё решине кому интерестно

//для того что бы можно было использовать TStringList нужно сначала текст ненмого обработать
procedure TForm1.ffnen1Click(Sender: TObject);
var
text,teiltex: string;
i:integer;
begin
Richedit1.Lines.LoadFromFile("mail.rtf");
text:=Richedit1.Text;
teiltex:="";
for i:=0 to length(text) do
begin
 if (" "= text[i])then
   begin
   listbox1.Items.Add(teiltex);// Приходится использовать listbox1 для того что бы записать текст в столбик  а удаление находится в следующей процедуре
   Teiltex:="";
   end
 else Teiltex:=teiltex+ text[i]
end ;
Richedit1.Lines:=ListBox1.Items;
end;

//Следующая процедура которая находит дупликаты и убивает их

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 SL : TStringList;
 text: string;
 td:TDuplicates;

begin

text:=Richedit1.Text;
SL:=TStringList.Create;
SL.Sorted:=true;
td:=dupIgnore; // Это значеине игнорирует все двойник в файле
SL.Duplicates:=td;
SL.Text:=text;

Richedit2.Text:=SL.Text;
end;


 
Anatoly Podgoretsky ©   (2005-06-12 14:21) [15]

Не требуются таких сложных преобразований, для разбивки на слова (то есть чтобы записать в столбик) пользуемся встроеными срествами того же TSrilngList как CommaText, для удаления дублей Sorted и dupIgnore. Никаких других компонент не требуется. Поработай в этом направлении.


 
Alx2 ©   (2005-06-12 15:24) [16]

>Anatoly Podgoretsky ©   (12.06.05 14:21)

Снимаю шляпу.
Я так мысли читать не умею :)


 
Anatoly Podgoretsky ©   (2005-06-12 15:51) [17]

Ну ты и гад, ведь ключат же в штатные телепаторы.


 
имя   (2005-06-12 19:21) [18]

Удалено модератором
Примечание: Смени ник. Запятая в нике недопустима!


 
Николай_герм   (2005-06-12 21:22) [19]

а кто против ?
имеется ввиду :  SL.CommaText:=text;

непремменно попробую.:)


 
Anatoly Podgoretsky ©   (2005-06-12 21:32) [20]

SL.CommaText:=text; или решение с DelimitedText, но для разделеных пробелом и первого хватает.


 
Alx2 ©   (2005-06-12 22:13) [21]

Прикола ради попытал свой код Alx2 ©   (12.06.05 11:41) на полуторамегабайтном файле. Получил EOutOfMemory :-)

Пришлось вместо наращивания Result сделать выкидывание из него. Иначе страшно фрагментируется куча.

Еще есть подозрения, что TStringList придает тормоза вместо ожидаемого ускорения.


 
Просто Джо ©   (2005-06-12 22:26) [22]

> [21] Alx2 ©   (12.06.05 22:13)
Для некоторого (иногда, значительного) устранения "тормозов" можно воспользоваться THashedStringList - там поиск строк реализован гораздо быстрее (через хэщ-таблицы, вероятно). Хотя, придется пожертвовать дополнительной памятью.


 
Alx2 ©   (2005-06-12 22:44) [23]

>Просто Джо ©   (12.06.05 22:26) [22]
Нет, я думаю дело не в скорости поиска, а в способе вставки нового элемента в TStringList.
Там для вставки используется сдвиг элементов массива.
Это занимает alpha*k времени, где k - количество элементов.
Бинарный поиск занимает beta*log(k). Итого время вставки есть
alpha*k + beta*log(k).
При пробеге по различным словам, общее количество которых есть n
получаем, что на вставку уходит beta*n*ln(n)+alpha*n*(n+1)/4+O(1/n) если бы alpha (затраты на вставку) равнялась нулю, все было-бы тип-топ. А так - сложность даже выше квадратичной.

А квадратичную сложность дает простой способ "в лоб":
Берем слово, все его дальнейшие вхождения забиваем мусором (символом, не входдящим в ValidSet).
И так для каждого слова.
Потом "выкидываем мусор" - операция по времени O(length(S)).

При проверке второй способ "в лоб" оказался действительно быстрее. (На 8Mb - в два раза)


 
Alx2 ©   (2005-06-12 22:48) [24]

Вдогонку: "забивку мусором" использовал и в использовании TStringList



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

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

Наверх




Память: 0.51 MB
Время: 0.046 c
1-1119341906
salexn
2005-06-21 12:18
2005.07.11
Почему на 98 виндах возникает ошибка Cannot load cursor resource


6-1112673037
Anton M. Ivanov
2005-04-05 07:50
2005.07.11
порт 80 занят.


4-1116013371
Kolan
2005-05-13 23:42
2005.07.11
Как получить Handle активного edit а (не моего).


4-1116153069
TwisteR(TFSoft)
2005-05-15 14:31
2005.07.11
Format в WinAPI


14-1118129757
Nikolay M.
2005-06-07 11:35
2005.07.11
В продолжение темы о шашлыках под Черноголовкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский