我有音频样本文件夹,我即将删除我不会使用的内容,但我想在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"
在帮助下,我设法创建了一个数据库并进行了一些输入,但我的输出如下:
当我想要的是这个:
我认为问题在于代码中的分隔。
另外,我需要代码来处理缺少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 :(得分:1)
@echo off
setlocal enabledelayedexpansion
set "fld=Z. Unsorted"
> "%fld%\TestDb.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%\TestDb.sql" echo INSERT OR REPLACE INTO "Samples" VALUES ^(!File!, !Publisher!, !Pack!, !Category!, !Type!, %%~zA^);
@echo !File!, !Publisher!, !Pack!, !Category!, !Type!, %%~zA
)
>> "%fld%\TestDb.sql" echo COMMIT;
sqlite3 -cmd ".read '%fld%\TestDb.sql'" "%fld%\TestDb.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 set "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
代码使用enabledelayedexpansion
表示某些变量。那是
对于使用!
而非%
的变量。
使用for
循环使用递归来解析目录以查找文件。
call :part "!relative_path!"
行获取%fld%
路径的各个部分
与Publisher,Pack,Category和Type的列值匹配。
然后它遍历该目录中的文件并插入 sql语句进入sql文件。
可能包含'
的sql插入值转义为''
。
标签for
中的:part
循环使用2-5
的标记。这将
将%%A
设置为Publisher
,将%%B
设置为Pack
,将%%C
设置为Category
,
%%D
到Type
。将2-5
的令牌设置调整为需要的值
匹配路径段。
如果变量,标签:part
中设置的当前变量设置为NULL
未定义其他变量是单引号转义和外部
单引号被添加。因此,准备插入原样。做得类似
到File
循环中的for
变量。
relative_path
变量是删除了%cd%
的绝对路径
从它和可能的领先反斜杠删除。它应该更容易
在for
标签的:part
循环中进行标记。