![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сравнение строк
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]Если файл маленький, то прочитать в стринглист и квадратичным алгоритмом просмотреть, удаляя лишние строки. Потом записать.
Если большое, то так не пойдет. Тогда прочитай про то, что такое суффиксные деревья. Читая файл записываешь каждую строчку в суффиксное дерево, рпедварительно дабавляя к ней фиктивный, отсутствующий в алфавите символ. При появлени новой строчки оценивай, есть ли она в дереве. Если нет, - дабавляем и печатаем. Оценка времени О(число строк*О(длина строки), правда памяти надо О(размер файла).
Если файл совсем большой, то будут тормоза из-за постоянного обращения к различным участкам непомерно большой памяти. В этом случае, дерево должно быть не суффиксным, а бинарным (лучше сбалансированным), и хранить там надо контрольные суммы.