Показать полную графическую версию : [решено] умный поиск-сравнение и замена в списках
Baranius
02-06-2012, 00:01
Да, да. Оно вроде так стройненько и логично. И, думаю, это будет проще и надежнее (не будет проблемы с ...пустые поля "|||" на "|~|~|")
Anonymоus
02-06-2012, 05:49
Baranius, поправил скрипт.
@Echo Off
SetLocal EnableDelayedExpansion
Set OldPList=test.plc
Set Output=new.plc
Set IndexFile=index.txt
rem Переписываем заголовок файла в новый плейлист
For /F "usebackq delims=" %%A In ("%OldPList%") Do (
Echo %%A>"%Output%"
GoTo Break
)
:Break
rem Разбираем строки старого плейлиста на составляющие
Echo Processing "%OldPList%"...
For /F "usebackq skip=1 tokens=1,2,3 delims=^|" %%A In ("%OldPList%") Do (
Set NewFilePath=
rem Ищем строку с таким же временем в индекс-файле
For /F "tokens=2 delims=^|" %%P In ('Type "%IndexFile%"^|Find "%%C"') Do (
Set NewFilePath=%%P
)
Echo Search for %%B
rem Генерируем строку нового плейлиста
If Not "!NewFilePath!"=="" (
Echo %%A^|!NewFilePath!^|%%C>>"%Output%"
) Else (
Echo %%A^|%%B^|%%C^|%%D>>"Error.log"
Echo ERROR: "%%B" not found in %IndexFile%, write to error.log
)
)
Echo All done
Pause
Такие урезанные до трех полей плейлисты в аимпе работают замечательно, он сам потом пересоздает недостающие поля.
Baranius
02-06-2012, 13:39
...он сам потом пересоздает недостающие поля
Я тоже об этом подумал: задача - проще, решение - надежнее. К тому же в тэгах попадаются записи типа
...|"8<C@ >4@8357||| (у меня дальше этого значения не создавался csv файл). Но мне не терпится проверить Ваше творение, попробую приготовить тяжелый тест. Главное самому не запутаться, спасибо заранее.
Anonymоus
02-06-2012, 14:37
в тэгах попадаются записи типа ...|"8<C@ >4@835 »
Это из-за неправильной кодировки. Как я уже упоминал, родной для таких плейлистов формат - UTF-16 LE
Baranius
02-06-2012, 17:28
...многоуважаемый Anonymоus!!
Огромное Вам Спасибо! Я получаю кучу удовольствия от этого занятия.
Батник чудесно работает. Я приготовил всё к тесту в таком примерно виде:
OLD.plc INDEX.plc NEW.plc
песня_1 песня_1 песня_1
песня_1
песня_1
песня_2 нет .log
песня_3 песня_3 песня_3
песня_3 песня_3
песня_4 песня_4 песня_4 хотел учесть все варианты, которые могут возникнуть после наведения порядка на диске. Песни с одинаковым номером - это действительно одинаковые, но по разному обозванные и лежащие в разных местах (Юрий Антонов, Антонов Юрий и просто Антонов)
И вот теперь мне интересно, почему батник, когда встречает три одинаковых файла (песня_1 (на рис. - Mr Saxobeat), не записывает их в результат (NEW.plc) - это было бы здорово, это тот отличный побочный результат (поиск дубликатов), который был бы очень полезен. Всё-таки нужен ещё один "if" в батнике, типа, если
значение из OLD.plc встречается в INDEX.plc два, три.., n-раз, мы все n строчек записываем в NEW.plc, заменив первое поле у них, с 1 на 0. И тогда в плейлисте эти строки будут отображаться как выключенные из проигрывания файлы (см. рис). Визуально - всё очень наглядно, а за счет второй строчки (настраиваемый вид) и информативно. Оценив файлы тут же, из плейлиста, дубликаты можно отправить в корзину.
И, если можно, оставьте старый вариант с ненайденным значением (песня_2 - на рис."Елка - Прованс") можно без ERRORa - просто перепишите его без изменений в NEW.plc (визуально в проигрывателе она будет обращать на себя внимание, и может это действительно нужная песня, которую в пылу борьбы за порядок на диске я удалил). Собственно и LOG хорошее решение, но в плане удобства первый вариант был нагляднее - все делать можно в окне плейлиста.
Уф, не быть мне программистом. Я только это сообщение писал часа два. А насчет моих хотелок.. так они хотелки и есть. Всё уже работает!!!
Baranius
08-06-2012, 12:22
Обжегшись на работе скрипта из темы поиска дубликатов (http://forum.oszone.net/thread-235875-2.html), решил проверить работу Вашего скрипта на реальных данных (index.txt = 15 000 строк, test.txt = 50 строк), боясь, что и тут начнутся тормоза. Ничуть не бывало. За несколько секунд был выдан результат. Я очень рад, ведь дубликаты можно искать и сторонними программами, коих тьма, а аналога Вашему скрипту я нигде не видел.
Теперь последний вопрос и тему можно считать закрытой:
- - позволяет ли алгоритм Вашего скрипта найти все совпадающие значения в списке "index.txt" (коих бывает и три, и четыре...) и записать их в вывод, или он построен так, что останавливает поиск на первом же найденном совпадении, считая, что задача выполнена?
- - т.е., для поиска всех совпадений нужно применять другое решение или можно модифицировать Ваше?
С уважением, Baranius
Baranius
14-06-2012, 21:58
Так, на всякий случай, может кто забредёт, да ответит на последний вопрос:
- позволяет ли алгоритм скрипта найти все совпадающие значения в списке "index.txt" (коих бывает и три, и четыре...) и записать их в вывод, или он построен так, что останавливает поиск на первом же найденном совпадении, считая, что задача выполнена?
Что поделать, музыкант я. Откуда и вопросы.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.