Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Корпоративное переименование


Автор: TwisT_X 18.9.2007, 21:51
Задание: входными данными является фаил с заданным числом сменных имен и заданным числом строк текста для исправлений..
Ниже приведен пример текста (кстати скопировал с ДРКБ  smile ):

Цитата

DRKB Explorer to DRKB Exp
DRKB to Delphi Base

Для чего нужен DRKB Explorer?
Основное назначение DRKB Explorer — расширить 
возможности стандартного DRKB, дополняя его 
значительным количеством новых, улучшенных функций.
DRKB Explorer обладает удобно организованным 
пользовательским интерфейсом и надежен в работе. 
Он легок в установке и обращении. Приложение способно 
обеспечить наиболее быстрый поиск необходимой вам 
информации в считаные секунды, используя возможности 
полнотекстового поиска, указателя, многочисленных 
фильтров, а также историю посещений и закладки. 
С DRKB Explorer вы никогда не почувствуете себя потерянным 
в океане информации.


Первые две строки - это то, что надо и на что надо заменить в тексте..
Помогите объяснить: каков должен быть алгоритм нахождения слов, которые надо заменить и заменяемые слова (алгоритм поиска первых двух строк)?!

Зарание блогадорю за участие в данной теме  smile 

Автор: Burka 18.9.2007, 22:16
ну а есть условие по которому надо искать слова? или как?

Автор: TwisT_X 18.9.2007, 22:21
Цитата

ну а есть условие по которому надо искать слова? или как? 

По идеи стандартными фнкциями Pos, Copy, Delete.. или еще работать со строками как с массивом..  Но мне кажется что легче функциями..

Автор: Burka 18.9.2007, 22:27
искать понятно что посом, я спрашиваю по какому условию слова отбирать надо?

Добавлено через 5 минут и 37 секунд
А, торможу) тебе надо простой реплейс сделать)

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

если я правильно понял что тебе нужно)

Автор: TwisT_X 18.9.2007, 22:33
Цитата

по какому условию слова отбирать надо? 

Ну в первых двух строках указаны слова:
Перед to то что надо заменть, а после to то на что надо заменить..

Автор: lukas 19.9.2007, 07:33
так... берем любую функцию для нахождения N-слова в строке, и делаем так...

1. находим количество слов..
2. делаем цикл от 1 до N слов... выделяем каждое слов... 
3. заменяем его... как хотим...

Посмотри на функции ParamStr и ParamCount, переделай их под себя... и все....  smile (Для просмотра функции CTRL+Клик на ее название)

Автор: TwisT_X 19.9.2007, 15:47
Цитата

Посмотри на функции ParamStr и ParamCount, переделай их под себя...

Для меня это еще пока что слишком новое  smile 

Мне самое главное это понять как выделить слова которые надо заменить и слова заменяемые(первые две строки) я не могу додуматься какой там должен быть примерно алгоритм  smile 

Автор: lukas 19.9.2007, 19:25
ну когда находим слово.... специальной функцией.... находим и начало B этого слово... и само слово (значит знаем его длину), затем удаляем все от B по длину слова, и вставляем (Insert) в позицию B нужное слово... переходим к следующему слову...  smile 

Автор: TwisT_X 19.9.2007, 21:06
Цитата

находим и начало B этого слово

1. что такое "В" ?!
2. мне надо понять алгоритм: как прога поймет какие слова искать и на что заминять (в данном случае первые две строки)..
3. а дальше уже легко будет  smile 

Автор: lukas 19.9.2007, 21:35
TwisT_X, 

блин... B - это типа позиция начала слова в строке... как как поймет...

функция ParamCount - количество слов в строке...  и получается цикл..

for I:=0 to ParamCount("строка") do 
 begin
   //ParamStr("строка",I);
 end;

Во общем посмари на мои функции....

Код


function GetPRMCount(S:String; Typ:Char):integer;
var
  i,pos_p,k:integer;
  len:integer;
  Stroka:boolean;
begin
 len:=Length(s);  stroka:=false;  pos_p:=1;
 i:=0;
 while (i<>len) do
  begin
 Inc(i);
    if S[i]='"' then stroka:=not(stroka);
    if stroka then continue;

     if (S[i]=Typ)and(S[I+1]<>'') then Inc(pos_p);
   end;
  Result:=Pos_p;
end;

function GetFastParam(S:String; N:byte; Typ:Char; Kav:Boolean = false):String;
  var
  i,k,pos_p,pos_b,pos_f:integer;
  len:integer;
  Stroka:boolean;
  label fin;
begin
 {найдем позицию разделителя N-ого параметра}
 len:=Length(s);  stroka:=false;  pos_p:=1;  pos_f:=1;
 pos_b:=1;
 if GetPRMCount(s,Typ)=1 then begin
    Result:=S;
    if Result[len]=Typ then
     delete(result,len,1);

    goto fin;
 end;
 i:=0;
 while (i<>len) do begin
    Inc(i);
    if i=1 then
     if Pos_P=N then
     begin    // нашли начальный разделитель
         pos_b:=i;
         break;
     end;
    if S[i]='"' then stroka:=not(stroka);
     if stroka then continue;

     if S[i]=Typ then Inc(pos_p);
     if Pos_P=N then
     begin    // нашли начальный разделитель
         pos_b:=i;
         break;
     end;
 end;
 {теперь ищем первый попавшийся}
 i:=Pos_B;
 while (i<>len) do
  begin
  Inc(i);
     if S[i]=Typ then
     begin
       Pos_F:=I;
       break;
     end;
   end;
   if pos_f=1 then pos_f:=len;

 i:=Pos_F-Pos_B; // находим длину параметра

 if Pos_B<>1 then begin
  if Pos_F<>len then
   Result:=Copy(S,Pos_B+1,i-1)
  else
   Result:=Copy(S,Pos_B+1,i+1)
 end else
 Result:=Copy(S,Pos_B,i);
 {---- убираем лишние символы ----}
fin:
 Result:=Trim(Result); len:=Length(Result);
 if Result='' then exit;
if not Kav then
  begin
 if (Result[len]in ['"',Typ])and(Result[1]='"') then
 begin
 delete(Result,Len,1);
 delete(Result,1,1);
 end;
  end;
end;


В общем использовать примерно так...

ShowMessage(GetFastParam('слово1, слово2, "слово3"  , слово4',3,',')); // слово номер 3, разделительный символ запятая... 

Подстрой под себя функции... ну или юзай пос и инсерт, делет... и т.п.

Автор: TwisT_X 20.9.2007, 23:07
lukas, ты мну натолкнул на идею..  smile 
Вот тока вопрос такой: есть ли оператор который с мемо считывает строку и перегоняет ее в переменную?! smile 

Автор: Alix 21.9.2007, 16:35
Код

  // записываем i+1 строку в переменную s
   s := memo1.lines[i];


Можно я тут вас попугаю? Если действовать согласно правилам 
Цитата
DRKB Explorer to DRKB Exp
DRKB to Delphi Base
 последовательно, то строка "DRKB Explorer" в итоге станет "Delphi Base Exp". Это нормально или надо избегать замены уже замененных ранее подстрок?

Автор: TwisT_X 21.9.2007, 19:55
хм.. А как указать максимальную строку в мемо?! (ну кол-во строк в мемо)
и если  s := memo1.lines[i];  мы  записываем i+1 строку в переменную s, то как записать i строку?!
Типо s := memo1.lines; ?!




Alix, канешо можешь попугать))
Надо избегать замены уже замененных ранее подстрок))
Я вот еще думаю как оформить алгоритм: или загрузить текст в мемо и работать исключительно мемо или просто сразу работать с файлом..
Может кто то подскажет как лучше или легче?!  smile 

Автор: Alix 21.9.2007, 20:21
Строки в memo.lines нумеруются от 0 до memo.lines.count-1. Поэтому когда мы обращаемся к строке [i] мы обращаемся к i+1 строке.

Лучше работать сразу с файлом, из одного пишем, в другой, временный, пишем, потом удаляем исходный и переименовываем временный.

Судя по Вашим вопросам, мучаться вы будете долго. Рекомендую почитать про алгоритмы поиска и замены строк.

Автор: TwisT_X 21.9.2007, 20:35
Alix, вы почти угадали  smile 
У меня еще нету с этим опыта.. Меня заинтересовали функции: ParamCount и  ParamStr..
Но пока я про них еще ниче не знаю и не нашел покачто  smile 
Не могли бы както об этом нимного рассказать?!

Автор: lukas 21.9.2007, 21:39
TwisT_X, 

короче... используй лучше мои... они аналогичные... работают с такой же скоростью... ParamStr(n) возвращает N-ый параметр командной строки, а ParamCount - количество этих параметров, параметры отделяются пробелами.... 

А текст естественно легче обрабатывать в Memo, или лучше поизучай TStrings и TStringList... т.к. свойство Lines (в мемо) имеет тип TStrings...

Поэтому не обязательно загружать в мемо, если не нужно отображать графически...

Код

...
 Var
 LS:TStringList;
begin
 LS:=TStringList.Create;
 LS.LoadFromFile('C:\TXT.TXT');
 // и обрабатывай как хочешь LS
 // если в MEMO отобразить... 
 MEMO1.Lines.Assign(LS);
 LS.Free; // освобождаем память от LS и полностью удаляем ее... 

Автор: Alix 22.9.2007, 10:06
Цитата
А текст естественно легче обрабатывать в Memo, или лучше поизучай TStrings и TStringList... т.к. свойство Lines (в мемо) имеет тип TStrings...

Не думаю что это так, особенно, если файл большой. Я бы читал построчно с помощью readln, его еще никто не отменял.


Автор: lukas 22.9.2007, 20:26
В Нашем случае... текстовый файл обычно редко бывает больше 1 мб... поэтому легче загрузить в TStrings и работать с ним... игра свечей не стоит... памяти много не сожрет... зато работать будет удобно, да и к тому же даю гарантию там файл не более 100 кб... зачем мудохотся с readln-ами...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)