Сохранение дубликатов строк
Как сохранить все дубликаты строк, именно сохранить а не удалить.
Вот так удаление идет дубликатов а вот интересно как их сохранить в отдельный файл ?
var
f1: TextFile;
st: string;
s: TStringList;
begin
AssignFile(f1, '1.txt');
reset(f1);
s := TStringList.Create;
While not EOF(f1) do
begin
readln(f1, st);
If s.IndexOf(st) < 0 then
s.Add(st);
end;
s.SaveToFile('2.txt');
s.Free;
CloseFile(f1);
end;
То есть были строки:
123
123
4444
55555
123
И на выходе база:
123
123
123
Дополнение: Можно сделать вот так:
var
f1: TextFile;
st: string;
s, s1: TStringList;
begin
AssignFile(f1, '1.txt');
reset(f1);
s := TStringList.Create;
s1 := TStringList.Create;
while not EOF(f1) do
begin
readln(f1, st);
if s.IndexOf(st) < 0 then
s.Add(st)
else
s1.Add(st);
end;
s.SaveToFile('2.txt');
s1.SaveToFile('double.txt');
s.Free;
s1.Free;
CloseFile(f1);
end;
Но получается что в файле double.txt не все дубликаты сохраняются.
То есть были строки:
123
123
4444
55555
123
В файле 2.txt результат
123 - Вот тут запись а она должна быть в файле **double.txt**
4444
55555
В файле double.txt результат
123
123
То есть одна строка 123 не туда записалась. Как это можно исправить ?
Ответы (1 шт):
Автор решения: Alekcvp
→ Ссылка
Ну у меня навскидку как-то так получилось. Явно не самый оптимальный вариант.
var
s: TStringList;
i: Integer;
d: Boolean;
begin
s := TStringList.Create;
s.Duplicates := dupAccept;
s.LoadFromFile('1.txt');
s.Sort;
i := 0;
d := False;
while i < s.Count - 1 do
begin
if s[i] = s[i + 1] then
begin
d := True;
Inc(i);
end else if not d then
s.Delete(i)
else begin
d := False;
Inc(i);
end;
end;
if not d then
s.Delete(i);
s.SaveToFile('double.txt');
s.Free;
end;