Как разделить адреса каталогов (рекурсивно) в пакетном файле?

314
Stack Johan

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

В настоящее время я пишу напрямую в базу данных, но я думаю, что запись в .CSVфайл и импорт в базу данных будет быстрее, потому что есть сотни файлов.

Используйте этот пакетный код для создания дерева каталогов, такого как моя файловая система + фиктивные файлы, для тестирования. Он будет создан в том месте, где вы выполняете файл. (В моем случае верхняя папка была названа Testing:

SET "BigFish=Z. Unsorted\Big Fish Audio\Midnight Jazz Train\Brass and Winds" SET "Fragments=Z. Unsorted\Loopmasters\Fragments 02\FR2_SOUNDS_&_FX\FR2_BASS" SET "LCycles=Z. Unsorted\Loopmasters\Hip-Hop Lunar Cycles\LUN_SYNTH_MELODY_LOOPS"  FOR %%A IN (Tenor_Sax, Trumpet) DO MD "%BigFish%\%%A" MD "%Fragments%" MD "%LCycles%"  @echo justtestjunk > "%Fragments%\loop.wav" @echo justtestjunk > "%LCycles%\drum.aiff" @echo justtestjunk > "%LCycles%\file.txt" FOR %%A IN (Tenor_Sax, Trumpet) DO echo justtestjunk > "%BigFish%\%%A\data.sql" 

С помощью мне удалось создать базу данных и сделать несколько записей, но мой вывод выглядит следующим образом (пример первой строки):

loop.wav, Testing, Z. Unsorted, Loopmasters, Fragments 02, 15 

Когда то, что я хочу, это:

loop.wav, Loopmasters, Fragments 02, FR2_SOUNDS_&FX, FR2_BASS, 15 

Я думаю, что проблема с разделением в коде . Кроме того, мне нужен код для обработки отсутствия Typeзначения (оставив его NULL)

Так...

Текущий код

@echo off  setlocal enabledelayedexpansion  SET fld="Z. Unsorted"  sqlite3 %fld%\TestDb.sqlite "CREATE TABLE IF NOT EXISTS \"Samples\" (File TEXT NOT NULL, Publisher TEXT, Pack TEXT NOT NULL, Category TEXT, Type TEXT, Size INT);"   for /r %fld% %%A in (*.aiff *.wav) do ( call :part "%%~dpA"  set "File=%%~nxA" set "File=!File:'=''!"  sqlite3 %fld%\TestDb.sqlite "INSERT OR REPLACE INTO \"Samples\" VALUES ('!File!', '!Publisher!', '!Pack!', '!Category!', '!Type!', '%%~zA');"  @echo '!File!', '!Publisher!', '!Pack!', '!Category!', '%%~zA' )  PAUSE  :part for /f "tokens=6-10 delims=\" %%A in ("%~1") do ( set "Publisher=%%~A" set "Publisher=!Publisher:'=''!"  set "Pack=%%~B" set "Pack=!Pack:'=''!"  set "Category=%%~C"  set "Category=!Category:'=''!"  set "Type=%%~D"  set "Type=!Type:'=''!" ) 
0
@ music2myear Я отредактировал свой вопрос. Я пробовал разные направления и не очень далеко. Я нахожусь над моей головой. Отправной точкой было бы выяснение того, как получить отдельные части путей. Stack Johan 6 лет назад 0
@ music2myear Я получил немного дальше в версии базы данных SQLITE. Я создал базу данных SQLITE в каждой папке издателя с нужными столбцами, но я не знаю, чтобы заполнить их данными. Stack Johan 6 лет назад 0
Я думаю, что вы неверно ссылаетесь на токены и переменные - проверьте принятый ответ для этого - и не забудьте избежать обратной косой черты, если это необходимо - https://stackoverflow.com/questions/15535424/separating-variable-with-a-symbol-into-different части Кроме того, вы не хотите использовать много разных баз данных sql, только одну с одной таблицей, поскольку вы можете выбрать по любому столбцу, чтобы получить подмножество ваших данных. ivanivan 6 лет назад 0
@ivanivan Я посмотрел на ответ. Какая часть должна помочь мне? - и я буду применять идею баз данных. Stack Johan 6 лет назад 0
Вы могли бы сделать этот вопрос намного проще, если бы вы спрашивали отдельно A) Как сделать CSV из ваших данных Затем, как только это будет сделано, B) Как импортировать CSV в SQLite barlop 6 лет назад 0
@ barlop Хм, ну, мне бы пришлось написать отдельный код на этом этапе. Я мог видеть, что может быть быстрее писать сначала в CSV, а затем импортировать. Вы можете добавить это решение в качестве ответа. - но у меня все еще были бы два нижних вопроса (у основания вопроса). Stack Johan 6 лет назад 0
@ StackJohan ваш вопрос не так уж хорош, потому что есть вопрос, что нужно для его воспроизведения. например, ваша структура каталогов, некоторые `aiff-файлы ', это так безобразно с точки зрения воспроизведения. Вы должны сделать свой вопрос простым примером / простой версией проблемы, которая демонстрирует вашу проблему. barlop 6 лет назад 0
@ barlop Я сделаю попытку и обновлю тебя позже Stack Johan 6 лет назад 0
@ barlop Я сделал полный редизайн вопроса. Проблема та же самая - но я спросил об этом напрямую; Я добавил пакет, чтобы воссоздать мою файловую систему - с пустыми файлами. Stack Johan 6 лет назад 0
@ StackJohan спасибо. Я не вижу, откуда вы берете данные для некоторых из этих полей `loop.wav, Testing, Z. Unsorted, Loopmasters, Fragments 02, 15` Откуда / вы бы взяли '15'? И откуда вы взяли тестирование. barlop 6 лет назад 0
@ barlop Не за что. `15` - это` 15KB` (размер файла) >> `'%% ~ zA'` - и` Testing` - родительская папка `Z. Unsorted`. Пакет вверху создаст `Z. Unsorted` в той папке, из которой вы его выполняете. Я выполнил сценарий в папке с именем `Testing`, и` set "Publisher = %% ~ A" `- это код, возвращающий это имя папки. Stack Johan 6 лет назад 0
@barlop Я опубликовал это в Stackoverflow, и один из участников дал мне решение, которое я искал. Я выложу это здесь. Он использовал файл SQL вместо импорта CSV (что значительно увеличило скорость) - и сценарий работает относительно пути его запуска. Stack Johan 6 лет назад 0

1 ответ на вопрос

1
Stack Johan

Я сделал кросс-пост на Stackoverflow и получил решение .

Обратите внимание, что скрипт должен быть размещен в том же каталоге, что и папка с образцом, и иметь структуру папки с образцами, как в моем примере.

Я поместил простое, неуклюжее объяснение в командный файл.

@echo off  setlocal enabledelayedexpansion  @echo This script will create an SQLite database of .wav or .aiff samples in the folder you select @echo(  @echo the script must be placed in the same directory as your sample folder. @echo( @echo Columns will be populated based on the following file structure:  @echo( @echo SampleFolder\Publisher\PackName\SampleCategory (i.e. Ambience)\SampleType (i.e. Rain)\Filename.wav @echo(  set /p "fld=What is the name of your sample folder? "  > "%fld%\SampleDb.sql" ( echo BEGIN; echo CREATE TABLE IF NOT EXISTS "Samples" ^(File TEXT NOT NULL, Publisher TEXT, Pack TEXT NOT NULL, Category TEXT, Type TEXT, Size INT^); )  for /r "%fld%" %%A in (*.aiff *.wav) do ( set "relative_path=%%~dpA" set "relative_path=!relative_path:%cd%=!" if "!relative_path:~,1!" == "\" set "relative_path=!relative_path:~1!"  call :part "!relative_path!"  set "File=%%~nxA" set "File='!File:'=''!'"  >> "%fld%\SampleDb.sql" echo INSERT OR REPLACE INTO "Samples" VALUES ^(!File!, !Publisher!, !Pack!, !Category!, !Type!, %%~zA^);  @echo !File!, !Publisher!, !Pack!, !Category!, !Type!, %%~zA )  >> "%fld%\SampleDb.sql" echo COMMIT;  sqlite3 -cmd ".read '%fld%\SampleDb.sql'" "%fld%\SampleDb.sqlite" ""  pause exit /b  :part for /f "tokens=2-5 delims=\" %%A in ("%~1") do ( set "Publisher=%%~A" if defined Publisher ( set "Publisher='!Publisher:'=''!'" ) else set "Publisher=NULL"  set "Pack=%%~B" if defined Pack ( set "Pack='!Pack:'=''!'" ) else "Pack=''"  set "Category=%%~C" if defined Category ( set "Category='!Category:'=''!'" ) else set "Category=NULL"  set "Type=%%~D" if defined Type ( set "Type='!Type:'=''!'" ) else set "Type=NULL" ) exit /b