![]() |
умный поиск-сравнение и замена в списках
Мои познания в программировании (78 год, вечерний факультет) ограничены словами "блок-схема", "Go to", "If" и "End". Поэтому с большим пиететом бродил по форуму, но понял, что из разных заготовок не смогу собрать решение для своей задачи. А задача, я думаю, актуальна для многих: как навести порядок среди музыкальных файлов и не потерять при этом плейлисты?, т.е. в первом приближении:
возможно ли в списке отделить имя файла от пути (попутно очистив от шелухи в виде цифр, +, _,-, и т.д.), затем найти достаточно точное соответствие этому имени в списке и выдать на гора свой список - "новый плейлист", в котором будут прописаны найденные соответствия уже с новыми путями? Решаются ли такие задачи? Может для этих целей есть уже готовые решения, и я стучусь в открытые двери? С уважением, Baranius. |
Цитата:
Цитата:
Код:
+ХУРСЕНКО ВЯЧЕСЛАВ-ТАТО ТАТО(+).mp3 Код:
Хурсенко - Тато.mp3 Код:
04 - Гоп ца-ца (укр+) коса.mp3 Код:
Укр - Гоп Ца-Ца.mp3 |
Мысли вслух - а что, если перед приведением файлов в порядок (переименование и сортировка), получить их хэши (MD5), соотнести с текущими именами файлов, построив этакий массив md5-имя, затем привести файлы в порядок, получить через For /R все отсортированные файлы, ещё раз получить md5 уже отсортированных файлов, и затем разбирать плейлисты, вытягивая из них старое имя, соотнося его с хэшем из массива, и затем подбирая нужный хэш из новых, отсортированных файлов, строя плейлист уже с новыми путями и именами?
|
Цитата:
|
Как я вижу этот "умный поиск-сравнение" (вот тебе и блок-схема)
- во-первых определиться, что список "старый плейлист" - это набор строк из "полных путей к файлам *.mp3"; - обратиться к первой строке; - выделить имя файла из полного пути; - исключить из этого имени все ненужное: цифры, +, _,-, и т.д. - разделить имя на составляющие его слова (используя к примеру "пробел" как разделитель); - сравнить полученные составляющие со списком "упорядочненные файлы на диске - (Artist - Title)" вот это, думаю, самое трудное - почти что Гугл получается; - при совпадении всех слов (5-ти, 4-х, 3-х, 2-х - это будет степень точности) в одной строке списка "упорядочненные файлы на диске - (Artist - Title)", записать определенным способом (об этом позже) эту строку вместе с путем в список "новый плейлист"; - GoTo ко второй строке. Эдак, лихо, по дилетански. Делов то! Да! И насчет: ХУРСЕНКО ВЯЧЕСЛАВ-ТАТО ТАТО(+), а нельзя ли провести сначала поиск по одному слову - "ХУРСЕНКО", а затем в уже найденных совпадениях искать "ВЯЧЕСЛАВ", затем - "ТАТО", т.е. по очереди? |
Цитата:
|
Не хочется сдаваться.
Anonymоus подсказал хорошую идею насчет контрольной суммы (MD5). Есть в плейлисте уникальное значение - (длительность в мсек), которое можно использовать как аналог MD5. Вот вид строки плейлиста: 1|полный путь|исполнитель|альбом|жанр|назв. песни|длительность мсек|размер байт)|№ трэка|год|44100|битрейт|каналы Длительность в мсек получается как 6-ти значное число и совпадения будут очень редки. Задача сводится к поиску одинаковых значений поля "длительность в мсек" в двух списках: 1 - может содержать только |длительность мсек|, 2 - |длительность мсек|полный путь| Возможно ли это? |
Baranius, имеющиеся утилиты (mp3info-win) не позволяют получить длительность в миллисекундах, только в секундах. Пример получения длительности:
Код:
mp3info -p "%S" "QNTAL - Flamma.mp3" Можно бы было попробовать организовать поиск, используя кроме старого имени из плейлиста, еще и информацию из IDv3 тегов (если они у вашей музыкальной коллекциии были прописаны), но лично я не хочу браться за эту задачу, успех её мне видится весьма сомнительным, учитывая затраченное время, проще будет пересоздать плейлисты вручную, а ведь автоматизация процесса призвана именно уменьшить затраченное время, а не увеличивать его. |
Уважаемый Anonymоus!
Плеер AIMP сам генерирует плейлисты такого вида как я выложил выше и длительность там записана в виде 6-ти значного числа - сек+мсек, поэтому я и подумал, что этот параметр может послужить заменой MD5. Вопрос не в том, как получить значение (длительности в данном случае), а как сравнить (соотнести) два списка с одинаковыми значениями в графе "длительность", но с разными значениями в графе "полный путь к файлу". |
Baranius, хорошо, что вы уточнили, каким плеером был создан плейлист. AIMP сохраняет в .plc, кодировка файла UTF-16 LE. Сейчас посмотрю, как можно разобрать плейлист такого формата.
|
Для тестирования я использовал вот такой плейлист
Код:
<Test:-1> Код:
D:\Music\Folk Metal\Woodscream\Pentadrama [2010]\Равновесие.mp3|[210782] В плейлист специально внесена ошибка - трек, который отсутствует в индекс-файле. Обработка осуществляется следующим скриптом: Код:
@Echo Off |
Вы, что, живете здесь? Так быстро отвечаете!!
А я уже, собственно получил результат (спасибо Вашему форуму), правда кружным путем: - нашел статью http://altblog.ru/quality-control-keywords/, скачал оттуда скрипт для Excel-я - плейлисты перевёл в .csv файл (| - как разделитель) - открыл и отредактировал их под скрипт - получил результат, но... радости никакой - замучился с кодировками (не знал, что это так важно), замучил две программы (notepad ++, excel) и вот только что наткнулся на этот топик http://forum.oszone.net/thread-211516.html - задача очень похожая. Ринулся проверять и ... осёкся. Не знаю какое расширение присвоить этому коду и чем его запустить (PowerShell установлена или надо самому установить - ищу) Ценю Ваше внимание. (это я, расторопный такой, писал еще не видя сообщения выше. Ну и скорость, я думаю медленнее) |
|
Цитата:
поэтому вопрос: (опять не успел) спасибо за ответ насчет PowerShell. |
Цитата:
Но вам придется убрать оттуда ненужные поля и заключить длительность в квадратные скобки. Что впрочем, совсем не трудно Код:
If Exist index.txt Del index.txt |
Цитата:
Попробую разобраться. Еще раз спасибо! |
Ух, ты!!
Эта железяка отзывается на мои телодвижения! Несколько кривовато, но я уже ничего не соображаю, чтобы это исправить. Чувствую - не удержусь от вопросов (на самом деле должно было звучать так - ни фига я сам не сделаю, придется опять кланяться). Спасибо, Anonymоus!!! |
Не за что, мне же не трудно, тем более, похожую проблему (сравнение списков) я уже как-то решал. На вопросы отвечу конечно, если они будут.
|
А вот и поклоны.
Всё это время разбирался с батником Код:
If Exist index.txt Del index.txt Два дня ушло, чтобы поменять "tokens=2,7" на "tokens=2,6" и ещё день, чтобы догадаться заполнить пустые поля "|||" на "|~|~|" в строках такого вида - 1|E:\_порядок\USA\pqrsT\Stan - Mr Saxobeat.mp3|||Other|Stan - Mr Saxobeat|194899|7796376|..., потому что вместо поля |длительность-194899| в index.txt записывалось поле |размер-7796376|. И вот пару часов назад нашел фриварную программку CSVed, с помощью которой я очень просто подготовил файл "index.txt". Это я к тому, что я вряд ли смогу переписать основной батник, зато легко теперь могу подогнать заготовки к одному виду (три поля): 1|полный путь|длительность - old.plc 1|полный путь|[длительность] - index.plc (или .txt) (CSVed сохраняет в ANSI, нужно ли перекодировать?). Дальше идёт нижайший поклон с просьбой подправить батник, под эти условия, пожалуйста! Кстати, в Вашем решении есть отличный побочный результат - поиск одинаковых по длительности файлов. И большая вероятность того, что это действительно одинаковые песни, только по разному названы и лежащие в разных местах. Это ж сколько места на диске может освободиться! А в мировом масштабе? |
Уточните пожалуйста, вы хотите и старый, и новый плейлисты перевести в формат "1|полный путь|длительность" с помощью CSVed, и нужно переписать основной батник именно под такой формат?
|
Да, да. Оно вроде так стройненько и логично. И, думаю, это будет проще и надежнее (не будет проблемы с ...пустые поля "|||" на "|~|~|")
|
Baranius, поправил скрипт.
Код:
@Echo Off |
Цитата:
...|"8<C@ >4@8357||| (у меня дальше этого значения не создавался csv файл). Но мне не терпится проверить Ваше творение, попробую приготовить тяжелый тест. Главное самому не запутаться, спасибо заранее. |
Цитата:
|
Вложений: 1
...многоуважаемый Anonymоus!!
Огромное Вам Спасибо! Я получаю кучу удовольствия от этого занятия. Батник чудесно работает. Я приготовил всё к тесту в таком примерно виде: Код:
OLD.plc INDEX.plc NEW.plc И вот теперь мне интересно, почему батник, когда встречает три одинаковых файла (песня_1 (на рис. - Mr Saxobeat), не записывает их в результат (NEW.plc) - это было бы здорово, это тот отличный побочный результат (поиск дубликатов), который был бы очень полезен. Всё-таки нужен ещё один "if" в батнике, типа, если значение из OLD.plc встречается в INDEX.plc два, три.., n-раз, мы все n строчек записываем в NEW.plc, заменив первое поле у них, с 1 на 0. И тогда в плейлисте эти строки будут отображаться как выключенные из проигрывания файлы (см. рис). Визуально - всё очень наглядно, а за счет второй строчки (настраиваемый вид) и информативно. Оценив файлы тут же, из плейлиста, дубликаты можно отправить в корзину. И, если можно, оставьте старый вариант с ненайденным значением (песня_2 - на рис."Елка - Прованс") можно без ERRORa - просто перепишите его без изменений в NEW.plc (визуально в проигрывателе она будет обращать на себя внимание, и может это действительно нужная песня, которую в пылу борьбы за порядок на диске я удалил). Собственно и LOG хорошее решение, но в плане удобства первый вариант был нагляднее - все делать можно в окне плейлиста. Уф, не быть мне программистом. Я только это сообщение писал часа два. А насчет моих хотелок.. так они хотелки и есть. Всё уже работает!!! |
Обжегшись на работе скрипта из темы поиска дубликатов (http://forum.oszone.net/thread-235875-2.html), решил проверить работу Вашего скрипта на реальных данных (index.txt = 15 000 строк, test.txt = 50 строк), боясь, что и тут начнутся тормоза. Ничуть не бывало. За несколько секунд был выдан результат. Я очень рад, ведь дубликаты можно искать и сторонними программами, коих тьма, а аналога Вашему скрипту я нигде не видел.
Теперь последний вопрос и тему можно считать закрытой: - - позволяет ли алгоритм Вашего скрипта найти все совпадающие значения в списке "index.txt" (коих бывает и три, и четыре...) и записать их в вывод, или он построен так, что останавливает поиск на первом же найденном совпадении, считая, что задача выполнена? - - т.е., для поиска всех совпадений нужно применять другое решение или можно модифицировать Ваше? С уважением, Baranius |
Так, на всякий случай, может кто забредёт, да ответит на последний вопрос:
- позволяет ли алгоритм скрипта найти все совпадающие значения в списке "index.txt" (коих бывает и три, и четыре...) и записать их в вывод, или он построен так, что останавливает поиск на первом же найденном совпадении, считая, что задача выполнена? Что поделать, музыкант я. Откуда и вопросы. |
Время: 13:19. |
Время: 13:19.
© OSzone.net 2001-