Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сравнение строк


Страницы:   1 2

sinoptikmoscow ©   (2007-08-28 18:07:00) 

Есть текстовый файл со строками:

Вася
Петя
Ира
Вася
Лена
Ира
Дима

Помогите сделать код, чтобы он искал повторяющиеся строки в файле и удалял их,
допустим нашел поле Ира, сохранил его а последующие строки "Ира" удалял.


Германн   (2007-08-29 02:09:00) [21]


> {RASkov} ©   (29.08.07 01:24) [14]

Да ладно. Спасибо, конечно, за копирайт, но пора его забыть.  Наверняка я не первый, кто предложил подобный вариант :)


{RASkov}   (2007-08-29 01:24:00) [22]

procedure DeleteDuplicate(Lb: TStrings);
var N: Integer;
begin
 for N:=Lb.Count-1 downto 1 do
  if Lb.IndexOf(Lb[N])<>N then Lb.Delete(N);
end;

© Германн
DeleteDuplicate(LS);
Где LS: TStrings;
и
LS:=TStringList.Create;
LS.LoadFromFile('ПетиВаси.txt');
....
LS.Free;


Евгений Р.   (2007-08-29 01:13:00) [23]


> В [0] ничего не сказано о том, что порядок строк можно акким-
> то образом менять. Значит, нельзя.


В [0] ничего не сказано о том, что порядок строк менять нельзя. Значит, можно.

А какой порядок в [0]? Вася должен стоять перед Петей или после???
Уверен, что в [10] удалится не тот!


TUser   (2007-08-29 00:21:00) [24]

В [0] ничего не сказано о том, что порядок строк можно акким-то образом менять. Значит, нельзя.


Евгений Р.   (2007-08-28 23:42:00) [25]

SL.LoadFromFile (...);
sl.sort;
n:=1;
while n<sl.count do Begin
 if sl[n]=sl[n-1] then sl.delete[n]
 else inc(n);
End;


TUser   (2007-08-28 21:24:00) [26]

var SL: TStringList;
   i, j: integer;
begin
 SL := TStringList.Create;
 try
  SL.LoadFromFile (...);
  for i := SL.Count - 2 downto 0 do
  for j := SL.Count - 1 downto i + 1 do
    if SL[i] = SL[j] then
      SL.Delete (j);
  SL.SaveToFile (...);
 finally
  SL.Free;
 end;
end;


sinoptikmoscow   (2007-08-28 20:57:00) [27]

а, всё заработало !!
СПАСИБО ВСЕМ !!!!!!
особенно grisme  )
вы тут все - реальные перцы )
с вами я быстро Delphi изучу ;)


sinoptikmoscow   (2007-08-28 20:37:00) [28]

to grisme

что-то он отрабатывает но не заменяет, ща посмотрю, может найду bad block


grisme   (2007-08-28 20:07:00) [29]

это "так" - на вскидочку. :) зы. как понял из сабжа, текст файловый, посему чтение и запись "построчные".

Procedure DoubleCleaner(fpath:String);
var
   tf:TextFile;
   strings:array of String;
   i,j:Integer;
begin
   AssignFile(tf, fpath);
   Reset(tf);
   while (EOF(tf) = FALSE) do
   begin
       SetLength(strings, Length(strings)+1);
       Readln(tf, strings[Length(strings)-1]);
   end;
   CloseFile(tf);
   for i:=0 to Length(strings)-2 do
       for j:=i+1 to Length(strings)-1 do
           if (strings[j] = strings[i]) then strings[j]:='';
   AssignFile(tf, fpath);
   Rewrite(tf);
   for i:=0 to Length(strings)-1 do
       if (strings[i] <> '') then Writeln(tf, strings[i]);
   CloseFile(tf);
end;


sniknik   (2007-08-28 19:57:00) [30]

procedure TForm1.Button1Click(Sender: TObject);
var
 list: TStringList;
begin
 list:= TStringList.Create;
 try
  list.Sorted:= true;
  //list.Duplicates:= dupIgnore; стоит по умолчанию
  list.LoadFromFile('D:\txt.txt');

  Memo1.Lines.Assign(list);
 finally
   list.Free;
 end;
end;


sinoptikmoscow   (2007-08-28 19:15:00) [31]

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


umbra   (2007-08-28 18:45:00) [32]


> квадратичным алгоритмом

он же - метод пузырька


Вудди   (2007-08-28 18:34:00) [33]

да просто это


sinoptikmoscow   (2007-08-28 18:29:00) [34]

квадратичным алгоритмом просмотреть, это как ?


TUser   (2007-08-28 18:21:00) [35]

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

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

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


Страницы:   1 2

Наверх

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