Wie teile ich Verzeichnisadressen (wiederverwendbar) in einer Batchdatei auf?

433
Stack Johan

Ich habe Ordner mit Audio-Samples, und ich werde gerade löschen, was ich nicht verwende. Ich hätte jedoch gern eine Aufzeichnung des ursprünglichen Inhalts in einer SQLite-Datenbank.

Momentan schreibe ich direkt in die Datenbank, aber ich denke, das Schreiben in eine .CSVDatei und das Importieren in eine Datenbank wären schneller, da es Hunderte von Dateien gibt.

Verwenden Sie diesen Batch-Code, um zum Testen eine Verzeichnisstruktur wie mein Dateisystem + Dummy-Dateien zu erstellen. Es wird erstellt, wo immer Sie die Datei ausführen. (In meinem Fall wurde der oberste Ordner benannt 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" 

Mit Hilfe habe ich es geschafft, eine Datenbank zu erstellen und einige Einträge vorzunehmen, aber meine Ausgabe sieht wie folgt aus (nur ein Beispiel der ersten Zeile):

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

Wann möchte ich Folgendes:

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

Ich denke, das Problem liegt in der Abgrenzung im Code . Außerdem brauche ich den Code, um das Fehlen eines TypeWerts zu behandeln (verlässt ihn NULL).

So...

Aktueller Code

@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 Ich habe meine Frage bearbeitet. Ich habe verschiedene Richtungen ausprobiert und bin nicht sehr weit gekommen. Ich bin über meinem Kopf. Ein Ausgangspunkt wäre, herauszufinden, wie man die einzelnen Teile der Pfade erhält. Stack Johan vor 6 Jahren 0
@ music2myear Ich bin in der SQLITE-Datenbankversion etwas weiter gekommen. Ich habe in jedem Publisher-Ordner eine SQLITE-Datenbank mit den gewünschten Spalten erstellt, weiß aber nicht, ob ich sie mit Daten füllen soll. Stack Johan vor 6 Jahren 0
Ich denke, Sie beziehen sich auf die Token und Variablen, die falsch sind - überprüfen Sie die akzeptierte Antwort - und denken Sie daran, wenn nötig Backslashes zu umgehen - https://stackoverflow.com/questions/15535424/separating-variable-with-a-symbol-into-different -Teile . Außerdem möchten Sie nicht viele verschiedene SQL-Datenbanken verwenden, sondern nur eine mit einer Tabelle, da Sie in jeder Spalte auswählen können, um eine Untermenge Ihrer Daten abzurufen. ivanivan vor 6 Jahren 0
@ivanivan Ich habe mir die Antwort angesehen. Welcher Teil sollte mir helfen? - und ich werde die Idee der Datenbanken anwenden. Stack Johan vor 6 Jahren 0
Sie könnten diese Frage um einiges vereinfachen, wenn Sie separat gefragt wurden. A) Wie erstelle ich eine CSV aus Ihren Daten? Sobald dies erledigt ist, B) Wie importiere ich die CSV in SQLite? barlop vor 6 Jahren 0
@barlop Hmmm, na ja, ich müsste an dieser Stelle einen separaten Code schreiben. Ich könnte sehen, dass es vielleicht schneller ist, zuerst in eine CSV zu schreiben und dann zu importieren. Sie können diese Lösung als Antwort hinzufügen. - aber ich hätte immer noch die beiden unteren Probleme (am Ende der Frage). Stack Johan vor 6 Jahren 0
@StackJohan Deine Frage ist nicht so gut, da es die Frage ist, was es braucht, um sie zu reproduzieren. ZB Ihre Verzeichnisstruktur, einige "Aiff-Dateien", ist aus Sicht der Reproduktion so hässlich. Sie sollten Ihre Frage zu einem einfachen Beispiel / einer einfachen Version des Problems machen, das Ihr Problem veranschaulicht. barlop vor 6 Jahren 0
@barlop Ich werde es versuchen und später aktualisieren Stack Johan vor 6 Jahren 0
@ barlop Ich habe die Frage komplett überarbeitet. Das Problem ist dasselbe - aber ich habe es direkt gefragt; Ich habe einen Stapel hinzugefügt, um mein Dateisystem mit Dummy-Dateien neu zu erstellen. Stack Johan vor 6 Jahren 0
@StackJohan danke. Ich kann nicht sehen, woher Sie die Daten für einige dieser Felder erhalten: loop.wav, Testing, Z. Unsorted, Loopmasters, Fragments 02, 15` Woher haben Sie '15'? Und woher hast du das Testen? barlop vor 6 Jahren 0
@barlop Gern geschehen. Die "15" ist "15KB" (die Größe der Datei) >> "" %% ~ zA "" - und "Testing" ist der übergeordnete Ordner von "Z". Unsortiert ". Der Stapel an der Spitze erstellt `Z. Unsorted` innerhalb des Ordners, aus dem Sie es ausführen. Ich habe das Skript in einem Ordner mit dem Namen `Testing` ausgeführt, und` set "Publisher = %% ~ A" ist der Code, der diesen Ordnernamen zurückgegeben hat. Stack Johan vor 6 Jahren 0
@barlop Ich habe dies auf Stackoverflow gepostet, und ein Mitglied gab mir die Lösung, nach der ich gesucht hatte. Ich werde es hier posten. Er verwendete eine SQL-Datei, anstatt eine CSV-Datei zu importieren (was zu einer erheblichen Geschwindigkeitssteigerung führte) - und das Skript funktioniert relativ zu dem Pfad, in dem es ausgeführt wird. Stack Johan vor 6 Jahren 0

1 Antwort auf die Frage

1
Stack Johan

Ich habe auf Stackoverflow einen Cross-Post gepostet und bekam eine Lösung .

Beachten Sie, dass das Skript im selben Verzeichnis des Beispielordners abgelegt sein muss und über die Beispielordnerstruktur wie mein Beispiel verfügt.

Ich habe eine grundlegende, unübersichtliche Erklärung in die Batchdatei eingefügt.

@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