Author Topic: Поиск и удаление дубликатов в тексте  (Read 5017 times)

0 Members and 1 Guest are viewing this topic.

Атеист

  • Guest
Привет уважаемому сообществу скриптоделов и лично создателю Johnny!
Посещаю этот форум я довольно часто и многому здесь научился. Это хороший форум, где действительно помогают новичкам.
Clickermann замечательная программа, выручает меня уже не первый год. Писать скрипты пытаюсь самостоятельно, но не всегда получается то что нужно, поэтому решился наконец пополнить ряды чайников, взывающих к опыту профи, и спросить совета.
Вопрос собственно виден из названия темы. Поиск я конечно юзал, по слову "дубликат", но попалось только - http://crapware.aidf.org/forum/index.php?topic=1694.msg9614#msg9614 .
С момента того обсуждения прошло почти 2 года, и та тема прочитана более 1460 раз. Очевидно, что тема актуальна и её решение многим облегчит жизнь впоследствии. Я надеюсь, что теперь есть решение такой проблемы как поиск и удаление дубликатов строк в текстовом файле. Приводить пример своего скрипта нет смысла, потому что его пока нет, либо он очень похож на код из той же старой темы http://crapware.aidf.org/forum/index.php?topic=1694.msg9616#msg9616 , но тот вариант слишком медленный (на поиск последнего элемента массива из моего файла он затачивает в среднем 245 миллисекунд, это сравнение всего 1 строки со всеми 1000 строками; а для удаления всех дубликатов видимо потребуется сравнить 1000 с 1000 строк).
Может кто поделится красивым алгоритмом, или хотя бы даст подсказку (словесную, я постараюсь понять)? Для тестов прилагаю текстовый файл "1000x32.txt" (это не сортированный список из 1000 строк, длиной по 32 символа, содержащий дубликаты), из которого нужно удалить повторяющиеся строки и сохранить остальные в другой текстовый файл. По времени, желательно уложиться в 1 секунду. Мне пока такое не по силам. Другого текста в скрипте не планируется (разве что вместо фходного файла будет буфер обмена), это будет готовый удобный инструмент, который всегда под рукой (как альтернатива программе Text Duplicate Killer).
Если я прошу не слишком многого, и если такое возможно написать на CMSкрипте, то пожалуйста помогите. Заранее спасибо.
« Last Edit: November 04, 2016, 09:28:18 PM by Атеист »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Поиск и удаление дубликатов в тексте
« Reply #1 on: November 04, 2016, 08:36:50 PM »
Для начала, в чем смысл? В удалении дубликатов или делании это именно кликерманом?
Просто например эту операцию текстовый редактор Akel Pad выполняет мгновенно. В нем есть встроенные возможности сортировки и удаления дубликатов строк.

Атеист

  • Guest
Re: Поиск и удаление дубликатов в тексте
« Reply #2 on: November 04, 2016, 08:53:09 PM »
Смысл в том и заключается, чтобы написать это на cms. Этот скрипт можно будет использовать как встроенный модуль для других скриптов, которые например обрабатывают большие базы MAC или IP адресов в автоматическом режиме без участия человека. Да и буфер обмена удобней отфильтровать простым нажатием Alt + A, чем запускать Excel или Akel Pad. В конце концов Clickermann тем и интересен, что дает возможность получать удовольствие от самого написания скриптов, а не только от их использования.   А Text Duplicate Killer и прочие проги, унылые, по сравнению с собственным алгоритмом, я так думаю.  :) Они то конечно могут всё, сможем ли мы?...
« Last Edit: November 04, 2016, 09:29:03 PM by Атеист »

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Поиск и удаление дубликатов в тексте
« Reply #3 on: November 04, 2016, 09:04:21 PM »
Смысл в том и заключается, чтобы написать это на kms. Этот скрипт можно будет использовать как встроенный модуль для других скриптов, которые например обрабатывают большие базы MAC или IP адресов в автоматическом режиме без участия человека. Да и буфер обмена удобней отфильтровать простым нажатием Alt + A, чем запускать Excel или Akel Pad. В конце концов Clickermann тем и интересен, что дает возможность получать удовольствие от самого написания скриптов, а не только от их использования.   А Text Duplicate Killer и прочие проги, унылые, по сравнению с собственным алгоритмом, я так думаю.  :) Они то конечно могут всё, сможем ли мы?...
KMS-активатор для операционных систем Windows ?
кто это мы? здесь нет и небыло никогда коллективного творчества у каждого скрипта есть единственный автор, все остальные пользуются его идеями и работой, максимум модифицируют скрипты под свои задачи. "Clickermann"- программа одного автора и никакого коллективного творчества не подразумевает изначально.

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Поиск и удаление дубликатов в тексте
« Reply #4 on: November 04, 2016, 09:14:14 PM »
245 миллисекунд, это сравнение всего 1 строки со всеми 1000 строками; а для удаления всех дубликатов видимо потребуется сравнить 1000 с 1000 строк).
Смешная у вас математика, она подразумевает, что:
1. дублирующих строк в файле реально нет.
2. дублирующие строки не удаляются.
3. уже проверенные строки проверяются повторно-многократно.
чем вас не устраивает скорость работы? обычно такие сортировки единовременны и даже если скорость работы в 10 раз меньше, о размер файла в 100 раз больше то результат остаётся приемлимым, так как на написание новой версии  сортирующего скрипта уйдет времени многократно больше, чем на его работу.

Атеист

  • Guest
Re: Поиск и удаление дубликатов в тексте
« Reply #5 on: November 04, 2016, 09:24:10 PM »
KMS-активатор для операционных систем Windows ?
Нет, это новый язык программирования, если угодно (расширение файла проекта *.cms), можно было и догадаться.
А говоря "мы", я подразумевал - сможет ли кто либо из нас в отдельности; знаю точно, что Johnny сможет, уже смог. Осталось только оформить в виде кода и выложить для народа на форум.
Ладно, хорошо, я не прошу невозможного, устроит ответ вида "Возможно" или "Невозможно". Не думаю что это многострочный скрипт, на написание которого уйдут годы. Я прошу помощи у тех кто может, и у тех кому интересно попытаться.

PS Исправил kms на cms
« Last Edit: November 04, 2016, 09:31:02 PM by Атеист »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Поиск и удаление дубликатов в тексте
« Reply #6 on: November 05, 2016, 09:31:28 AM »
Написать можно но скорость обработки все равно слишком низкая. Не для того кликер предназначен.

Ради интереса написал на AutoIt простенькую программку для этих целей.
https://yadi.sk/d/C_2ZcdPoy6q7Y

Программа живет в трее и ждет нажатия Ctrl+C. После анализирует содержимое буфера. Если там многострочный текст, удаляет дубликаты строк и результат записывает обратно в буфер. Работает очень быстро.

Улучшенная версия.
https://yadi.sk/d/okzVxVWoy8B5J
Теперь буфер переписывается только в случае обнаружения дубликатов.
Защита против повторного запуска.
Опции в трее включающие сообщение и звуковой сигнал по окончании операции.
« Last Edit: November 24, 2016, 07:14:18 AM by Oraven »

Атеист

  • Guest
Re: Поиск и удаление дубликатов в тексте
« Reply #7 on: November 05, 2016, 10:07:03 AM »
Oraven спасибо огромное за проделанную работу и такую замечательную программу. Работает действительно мгновенно, даже со списком из 5000 строк!
Я знал что тут помогают всегда очень оперативно и грамотно. Но настолько! Просто нет слов, очень приятно.  :)  За Clickermann правда немного обидно, хотя я понимаю, что его интерпретатор работает с языком очень высокого уровня, поэтому и скорость соответствующая. Буду держать твою программу всегда под рукой, очень пригодится.
Кстати таких программ в интернете нет, или хрен найдешь когда нужно.
СПАСИБО БОЛЬШУЩЕЕ!  :)

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Поиск и удаление дубликатов в тексте
« Reply #8 on: November 05, 2016, 12:42:48 PM »
...
Может кто поделится красивым алгоритмом, или хотя бы даст подсказку (словесную, я постараюсь понять)? Для тестов прилагаю текстовый файл "1000x32.txt" (это не сортированный список из 1000 строк, длиной по 32 символа, содержащий дубликаты), из которого нужно удалить повторяющиеся строки и сохранить остальные в другой текстовый файл. По времени, желательно уложиться в 1 секунду.
...

Можно такое сотворить на Clickermann'е, и очень просто. Мне такая задачка просто уже встречалась, поэтому могу предложить два разных,  простых варианта. У каждого свои плюсы и минусы.

Первый вариант:
[spoiler]
Code: (clickermann) [Select]
$t = $_ms
TFREADARR("1000x32.txt", $arr)
$arrsize = ARRSIZE($arr)
$str = ""
FOR($n = 0, $n < $arrsize)   
   $substr = ARRPOP($arr)   
   IF(STRPOS($str, $substr) = 0)     
      $str = STRCONCAT($str, ";", $substr)     
   END_IF   
END_CYC
STRSEPARATE($str, ";", $arr2)
TFWRITEARR("output.txt", $arr2)
LOGWRITE ( "Затрачено ", ROUND(($_ms - $t)/1000, -2), " сек." )
HALT

Для заданного в задаче текста этот вариант подходит, т.к. строки одинаковой длины. В противном случае, придется изменить строки скрипта 6 и 8 (поставить знак разделителя перед и после субстроки, естественно в самом тексте знак разделителя встречаться не должен). Длина строки, с которой сможет работать Clickermann, может достигать миллиона символов (длиннее не проверял). В секунду этот сценарий не укладывается, у меня он выполняется за 2,4 секунды.

[/spoiler]

Второй вариант: (укладываемся в одну секунду)
[spoiler]
Code: (clickermann) [Select]
$t = $_ms
TFCLEAR("output.ini", 0)
TFREADARR("1000x32.txt", $arr)
$arrsize = ARRSIZE($arr)
FOR($n = 0, $n < $arrsize) 
   INIWRITE("output.ini", $arr[$n], "", "SECTION") 
END_CYC
TFDELETE("output.ini", 1)
LOGWRITE ( "Затрачено ", ROUND(($_ms - $t)/1000, -2), " сек." )
HALT

Этот вариант работает быстрее раза в четыре(!). В нем нет никаких условий и сравнений. Всю работу вытягивает функция INIWRITE(). Что и как она там делает, одному Johnny известно. :) Но, дубликатов записей параметров, в ini файл, она просто не допускает. Действительно, Johnny давно всё смог и придумал, нам осталось только правильно этим воспользоваться. Для нашей задачи, в этом варианте, есть небольшой минус - к строкам в выходном файле дописывается символ "=". Но это легко лечится при считывании строк для последующих действий. Зато, в таком виде, скрипт быстр и всеяден. У меня он выполняется за 640 миллисекунд.

[/spoiler]

Вариант предложенный Андреем мне очень понравился, прога действительно шустрая и полезная. С такой скоростью работы её можно даже включать в сценарии, практически без задержки на её выполнение. :) И вообще приятно наблюдать за такой самоотверженной работой. Спасибо. :)

По итогам проделанной работы предлагаю: флуд в корзину; тему в закладки; DupStringKiller в массы! И всем удачи! :)

Атеист

  • Guest
Re: Поиск и удаление дубликатов в тексте
« Reply #9 on: November 06, 2016, 05:18:15 PM »
Atas, спасибо.
Это я и искал изначально. Я использовал эти функции тысячу раз в своих задачах, а тут как ослеп. Оба алгоритма в три строки(!), запущенных в цикле. Теперь мучаюсь вопросом - почему я не догадался?
Видеть очевидное и простое в сложном, это дар свыше. Мне видимо, это не грозит. Кажется, я обречен лишь созерцать красоту и не более. :-\
Спасибо братцы, вы очень мне помогли и научили.

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Re: Поиск и удаление дубликатов в тексте
« Reply #10 on: November 23, 2016, 01:59:03 PM »
Atas, спасибо.
Это я и искал изначально. Я использовал эти функции тысячу раз в своих задачах, а тут как ослеп. Оба алгоритма в три строки(!), запущенных в цикле. Теперь мучаюсь вопросом - почему я не догадался?
Видеть очевидное и простое в сложном, это дар свыше. Мне видимо, это не грозит. Кажется, я обречен лишь созерцать красоту и не более. :-\
Спасибо братцы, вы очень мне помогли и научили.

У меня та же трабла, что и у тебя, отсутствие "дара свыше". Да плюс у меня ещё и "сестра таланта": всё то восхищение помощью модеров, что ты описал в двух сообщениях и пяти абзацах (поэт!), у меня умещается в одно слово "спс", не знаю, как это, насколько нормально. Просто я внутри ощущаю благодарность за подсказки, и думаю, что помогающим мне станет от моего "спасибо" понятно моё отношение к ним, сорри если косноязычно выразился. Но думаю, раз Золотой пишет, что тут "не каждый раз и спасибо услышишь", то это достаточно массовая картина у нас в стране из-за нашей закрытой ментальности. Но полагаю, это не потому что люди плохие, просто они наверно точно так же внутри ощущают благодарность, но стесняются сказать о чувствах вслух, но даже если и критикуют, то это только потому что они не равнодушны к продукту и желают его развития/ внедрения новых фишек.

У меня вот подчас такое же умиление возникает, когда функцию расписанную мной на полстраницы, у когот получается изящно уместить в пару строк -__- Сразу ощущаешь себе таким нубасом-думбассом от программирования))