![]() |
Разделение текстового файла на переменное количество частей и перемещение этих частей
С Вашей помощью у меня получается создать папки с плейлистами
Срипт
Код:
@echo off В папке "E:\Air\playlists" у меня лежит много подпапок. В каждой подпапке есть папка "elements" elements
Цитата:
В папках "elements" лежат миниплейлисты. Их имена = именам плейлистов, которые созданы предыдущим скриптом, но с тегами 01, 02, 03... Пример: 1. В папке "F:\Music\MPL\Chillout" есть файл "chillout.alb". В папке "E:\Air\playlists\Folder01\elements" есть файл "chillout01.alb", а в папке "E:\Air\playlists\Folder03\elements" есть файл "chillout02.alb". В остальных папках "E:\Air\playlists\*\elements" файлы "chillout**.alb" отсутствуют. Всего 2. В папке "F:\Music\MPL\Trance" есть файл "trance.alb". В папке "E:\Air\playlists\Folder01\elements" есть файл "trance01.alb", в папке "E:\Air\playlists\Folder02\elements" есть файл "trance02.alb", а в папке "E:\Air\playlists\Folder04\elements" есть файл "trance03.alb". В остальных папках "E:\Air\playlists\*\elements" файлы "trance**.alb" отсутствуют. Всего 3. 2. После запуска скрипта он должен определить, что в подпапках "F:\Music\MPL" есть файл "chillout.alb", а во всех подпапках "E:\Air\playlists\*\elements" есть 2 файла с тегом "chillout" в названии. То же самое сравнение для "trance" и всех остальных. 3. Скипт разделяет файл "F:\Music\MPL\Chillout\chillout.alb" на "F:\Music\MPL\Chillout\chillout01.alb" и "F:\Music\MPL\Chillout\chillout02.alb" с одинаковым количеством строк. "F:\Music\MPL\Trance\trance.alb" разделяет на "F:\Music\MPL\Trance\trance01.alb", "F:\Music\MPL\Trance\trance02.alb" и "F:\Music\MPL\Trance\trance03.alb" с одинаковым количеством строк. 4. Замена существующих "E:\Air\playlists\*\elements\chillout**.alb" и "E:\Air\playlists\*\elements\trance**.alb" новыми "F:\Music\MPL\Chillout\chillout**.alb" и "F:\Music\MPL\Trance\trance**.alb" Вот как-то так. Надеюсь я не путано объяснил, что я хочу получить в итоге? |
Упрощу задачу.
Есть структура директорий\файлов Цитата:
Код:
Set "dir=F:\Music\MPL\*" Код:
for /f "tokens=*" %%i in (ля-ля-ля) do ( Скрипт должен смотреть на теги (**) файлов "*(**).alb" и разделять этот файл на (**) файлов с равным количеством строк, создавая например из файла "chillout(2).alb" два файла "chillout 01.alb" и "chillout 02.alb", после чего исходный файл "chillout(2).alb" удаляется. |
Вот что я сварганил на эту тему в смысле условий
Код:
@Echo On |
Из вашего объяснения мало чего понятно, я понял только, что надо разделить файл на равное кол-во строк. Пример, как можно разделить файл на равные части:
Код:
@echo off В последнем файле будет остаток. ЗЫ. батники, это худший из вариантов для работы с текстом. ЗЫЫ. Если вам надо просто составить плейлисты для эфира, то проще взять некоторое кол-во файлов из ВСЕЙ коллекции, в произвольном порядке и не мучиться с составлением каких-то промежуточных плейлистов. Например, нужно воспроизвести 10 произвольных файлов из 100 Гб музыки. Как я это решил для себя на PowerShell: Код:
param ($count = 10, $root = 'D:\MUSIC') Код:
D:\MUSIC\NATIVE\Руян\2014. Лебедь Белая\06 - Дружина.mp3 |
Foreigner, примеров разделения по количеству строк много. Мне же нужно разделение на части.
Например есть 3 файла. В одном 2000 строк и его надо разделить на 4 равных части. то есть должно получиться 4 файла по 500 строк. В другом 1500 строк и его надо разделить на 2 части по 750 строк, в третьем 1500 строк и его надо разделить на 3 части по 500 строк. Учитывая, что я в языках полный ноль, подскажите, будет ли ваш пример PowerShell работать в Win XP SP3? Возможно мне стоит описать полностью все задание и выложить на фрилансе? Но какой язык мне просить на реализацию задания? К сожалению я жестко привязан к Win XP SP3. Эфир полностью автоматизирован на QBasic. |
Цитата:
Цитата:
|
Цитата:
Попробовал файл из 1500 строк разбить на три файла по 500. Все отработало корректно. Файл создал в PowerShell (так проще): Код:
& {for ($i = 1; $i -le 1500; $i++) { "$('{0:d4}. ' -f $i)$(get-random)" }} | sc test.txt Код:
0001. 1684051906 Код:
@echo off Проблема батника при работе с текстом -- есть большая вероятность, что при попадании в раздачу спец.символов (=,&,|,%,>,<) результат может оказаться не тем, который вы ожидаете увидеть. Все это так или иначе решается, но если честно нет особого желания этого делать. Ну а PowerShell на Win ХР надо ставить дополнительно (будет вторая версия) + Net.Framework. Код, с небольшими изменениями, будет работать: Код:
param ($count = 10, $root = 'D:\MUSIC') |
Цитата:
Цитата:
|
alb=txt
Весь скрипт должен отталкиваться от ini-файла в абзаце 5. 1. Есть коллекция музыки, распределенная в папках по стилям. Цитата:
Цитата:
В принципе уже есть скрипт "Windows Batch file", который создает из коллекции готовые плейлисты, но учитывая весь объем задания, скорее всего его придется переписывать под другой язык Скрытый текст
Код:
@echo off Этот скрипт опираясь на структуру папок в "F:\Music" создает в папке "F:\MPL" такую же структуру директорий и в каждую подпапку кладет плейлист с таким же именем, как и у подпапки. На выходе получается Цитата:
4. У каждого созданного плейлиста в имени есть цифровой тег "_*". Этот тег задает количество миниплейлистов, на которое должен быть разбит плейлист. То есть, если у нас есть "F:\MPL\Chillout_2\chillout_2.alb" на "х" строк, то из него должно получится "F:\MPL\Chillout_2\chillout 01.alb" на "Х/2" строк и "F:\MPL\Chillout_2\chillout 02.alb" на "х/2" строк а сам "F:\MPL\Chillout_2\chillout_2.alb" должен быть удален. Если в теге файла кроме основного есть еще значение "с" (на пример "F:\MPL\Jazz_c_10\Jazz_c_10.alb"), то файл не разбивается на строки, а из него просто делается 10 копий с именами Цитата:
5. Перемещение. Я создам "F:\MPL\plst.ini" в котором задам соответствие такого типа Цитата:
Для начала все папки "E:\Air\playlists\*\elements" должны очищаться. В примерах выше я разбивал "F:\MPL\Chillout_2\chillout_2.alb" на "F:\MPL\Chillout_2\chillout 01.alb" и "F:\MPL\Chillout_2\chillout 02.alb". В "F:\MPL\plst.ini" у нас указано, что "F:\MPL\Chillout_2\chillout 01.alb" и "F:\MPL\Chillout_2\chillout 02.alb" должны попадать в "E:\Air\playlists\one\elements" и "E:\Air\playlists\two\elements". То есть "chillout 01.alb" перемещается в "E:\Air\playlists\one\elements", "chillout 02.alb" в "E:\Air\playlists\two\elements". И так для остальных... 6. После такого распределения у нас в папках "E:\Air\playlists\*\elements" оказывается много миниплейлистов. На пример в папке "E:\Air\playlists\two\elements" появляется три миниплейлиста ("Chillout 02.alb", "Trance 01.alb" и "New Age 02.alb"). Выше я писал, что в каждой папке "E:\Air\playlists\*" есть файл "MAIN.alb". Нам нужно файлы "Chillout 02.alb", "Trance 01.alb" и "New Age 02.alb" соединить в один, перемешать/рандомизировать его и сохранить как "E:\Air\playlists\*\MAIN.alb" заменив им старый. Вот как-то так. Предложения в личку. Цитата:
Цитата:
|
Цитата:
Код:
@echo off |
Всем спасибо. Принято в работу фрилансером.
|
Время: 16:35. |
Время: 16:35.
© OSzone.net 2001-