Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.12.2017, 18:55
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию Сохранение дублей в отдельный файл

Всем привет!
Помогите пожалуйста новичку. Есть текстовый файл с неким количеством одинаковых ссылок.
Нужно из этого файла выбрать в отдельный файл по одному дубликату, а ссылки у которых нет дублей, в другой отдельный файл.
Заранее спасибо!
Ответить с цитированием
  #2  
Старый 09.12.2017, 20:41
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
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  
Старый 09.12.2017, 20:55
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

Спасибо огромное, все работает!!!
Ответить с цитированием
  #4  
Старый 09.12.2017, 22:13
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

Есть проблема. Если в файле все ссылки с дублями, то работает нормально. Если есть одинарные, то они почему то выводятся в оба файла, с дублями и без.
Ответить с цитированием
  #5  
Старый 09.12.2017, 23:10
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от corzh
...Если есть одинарные, то они почему то выводятся в оба файла, с дублями и без.
Такое ТЗ у вас было, как написано, так и выполнено Ведь пример перед глазами - тогда и в первом цикле отлова уникальных строк нужно вместо прямого присвоения c:= 1 задействовать её инкримент, и если после просмотра переменная > 1 то заносим во второй список, иначе, пропустить
Ответить с цитированием
  #6  
Старый 09.12.2017, 23:15
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

А можно сделать тогда без сохранения уникальных ссылок, а только сохранять по одному дубликату?
Основная задача стоит, чтобы определить дубликаты и вывести по одному дубликату в отдельный файл.

Последний раз редактировалось corzh, 09.12.2017 в 23:18.
Ответить с цитированием
  #7  
Старый 10.12.2017, 00:13
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Проще второй циклоблок заменить на
Код:
 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  
Старый 10.12.2017, 00:20
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

Вот теперь все как и хотел. Спасибо еще раз огромное!!!
Ответить с цитированием
  #9  
Старый 11.12.2017, 16:52
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

Прошу не посчитать за наглость, Вы мне и так очень помогли.
Хотел немного изменить тз.
Есть некое количество файлов в которых есть одинаковые ссылки. Нужно вытащить из них дубли в тдельный файл.
Только есть нюанс. Дубликаты нужны только те, которые есть во всех файлах. Если хотя бы в одном файле его нет, тогда эта ссылка не нужна.
Возможно так сделать?
Заранее спасибо!!!

Последний раз редактировалось corzh, 11.12.2017 в 17:02.
Ответить с цитированием
  #10  
Старый 11.12.2017, 18:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Так что мешает предварительно собрать все ссылки в "общачный" стринГлист, а дальше всё по алгоритму - если число упоминаний строки > 1, то заносим её в список, а иначе (s = 1) пропустить

З.Ы. Или тогда покажите образчик текстовых файлов
Ответить с цитированием
  #11  
Старый 11.12.2017, 18:39
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

В том то и дело, что файлов может быть 5 или 10 и не все дубли нужны, а только те, которые есть во всех к примеру 10 файлах, а из общего списка, выбираются все дули.
Ответить с цитированием
  #12  
Старый 11.12.2017, 18:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Так всёравно нужен "накопитель" ссылей, если после циклического опроса всех файлов (напр. рекурсивной функцией с выносом всех уникальных строк и проверкой наличия текущей в "накопителе") число обращений равно кол-ву файлов, то заносим в нужный список, вроде так
Ответить с цитированием
  #13  
Старый 11.12.2017, 18:50
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

Файлы я вам скинул в личку. Когда я их сравнивал батником, то общих ссылок вывелось 641.
Ответить с цитированием
  #14  
Старый 11.12.2017, 18:57
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп: Перебираемся пока в личку, а результат выложу здесь, немного с задержкой
Ответить с цитированием
  #15  
Старый 11.12.2017, 19:00
corzh corzh вне форума
Прохожий
 
Регистрация: 09.12.2017
Сообщения: 10
Версия Delphi: XE7
Репутация: 10
По умолчанию

Хорошо. Спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter