![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет!
Помогите пожалуйста новичку. Есть текстовый файл с неким количеством одинаковых ссылок. Нужно из этого файла выбрать в отдельный файл по одному дубликату, а ссылки у которых нет дублей, в другой отдельный файл. Заранее спасибо! |
|
#2
|
||||
|
||||
|
Код:
procedure ruz(fn, dupfn, nodupfn: string);
var
sl1, sl2, sl3: TStrings;
i, b, c: integer;
begin
sl1:= TStringList.Create;
sl2:= TStringList.Create;
sl3:= TStringList.Create;
sl1.LoadFromFile(fn);
sl2.Add(sl1[0]);
for i := 1 to sl1.Count-1 do
begin
c:= 0;
for b := 0 to sl2.Count-1 do
if sl1[i] = sl2[b] then c:= 1;
if c = 0 then sl2.Add(sl1[i]);
end;
for i := 0 to sl2.Count-1 do \\ С нуля здесь список должен крутиться
begin
c:= 0;
for b := 0 to sl1.Count-1 do
if sl2[i] = sl1[b] then inc(c);
if c = 1 then sl3.Add(sl2[i]);
end;
sl2.SaveToFile(dupfn);
sl3.SaveToFile(nodupfn);
sl1.Free;
sl2.Free;
sl3.Free;
end;
...
// Вызов
ruz('total.txt', 'dup.txt', 'nodup.txt');Последний раз редактировалось Alegun, 09.12.2017 в 21:06. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
corzh (09.12.2017)
| ||
|
#3
|
|||
|
|||
|
Спасибо огромное, все работает!!!
|
|
#4
|
|||
|
|||
|
Есть проблема. Если в файле все ссылки с дублями, то работает нормально. Если есть одинарные, то они почему то выводятся в оба файла, с дублями и без.
|
|
#5
|
||||
|
||||
|
Цитата:
Ведь пример перед глазами - тогда и в первом цикле отлова уникальных строк нужно вместо прямого присвоения c:= 1 задействовать её инкримент, и если после просмотра переменная > 1 то заносим во второй список, иначе, пропустить |
|
#6
|
|||
|
|||
|
А можно сделать тогда без сохранения уникальных ссылок, а только сохранять по одному дубликату?
Основная задача стоит, чтобы определить дубликаты и вывести по одному дубликату в отдельный файл. Последний раз редактировалось corzh, 09.12.2017 в 23:18. |
|
#7
|
||||
|
||||
|
Проще второй циклоблок заменить на
Код:
for i := sl2.Count-1 downto 0 do
begin
c:= 0;
for b := 0 to sl1.Count-1 do
if sl2[i] = sl1[b] then inc(c);
if c = 1 then
begin
sl3.Add(sl2[i]);
sl2.Delete(i);
end;
end; |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
corzh (10.12.2017)
| ||
|
#8
|
|||
|
|||
|
Вот теперь все как и хотел. Спасибо еще раз огромное!!!
|
|
#9
|
|||
|
|||
|
Прошу не посчитать за наглость, Вы мне и так очень помогли.
Хотел немного изменить тз. Есть некое количество файлов в которых есть одинаковые ссылки. Нужно вытащить из них дубли в тдельный файл. Только есть нюанс. Дубликаты нужны только те, которые есть во всех файлах. Если хотя бы в одном файле его нет, тогда эта ссылка не нужна. Возможно так сделать? Заранее спасибо!!! Последний раз редактировалось corzh, 11.12.2017 в 17:02. |
|
#10
|
||||
|
||||
|
Так что мешает предварительно собрать все ссылки в "общачный" стринГлист, а дальше всё по алгоритму - если число упоминаний строки > 1, то заносим её в список, а иначе (s = 1) пропустить
З.Ы. Или тогда покажите образчик текстовых файлов |
|
#11
|
|||
|
|||
|
В том то и дело, что файлов может быть 5 или 10 и не все дубли нужны, а только те, которые есть во всех к примеру 10 файлах, а из общего списка, выбираются все дули.
|
|
#12
|
||||
|
||||
|
Так всёравно нужен "накопитель" ссылей, если после циклического опроса всех файлов (напр. рекурсивной функцией с выносом всех уникальных строк и проверкой наличия текущей в "накопителе") число обращений равно кол-ву файлов, то заносим в нужный список, вроде так
|
|
#13
|
|||
|
|||
|
Файлы я вам скинул в личку. Когда я их сравнивал батником, то общих ссылок вывелось 641.
|
|
#14
|
||||
|
||||
|
Оффтоп: Перебираемся пока в личку, а результат выложу здесь, немного с задержкой
|
|
#15
|
|||
|
|||
|
Хорошо. Спасибо.
|