我有一个包含近百万个XML文件的目录。不用说,加载需要花费很长时间(20分钟以上)。因此,我正在编写一个脚本,将文件分成最高级别为年份和每年下个月的文件夹。有4个主文件名,日期可以从第三个标记中提取,其余的从第二个标记中提取。即:从XML文件中提取日期并将文件移动到从日期创建的目录
BA1253570001_BALMIS_20130617_TRC_0_109506738E.xml
BA1254260001_ACCTV21_20140430_AMR_0_1095611492.xml
BA1736330001_SWFTOUT_20140929_LIQ_1_MTBX553494.xml
BA1739240001_FEDOUT_20140904_LIQ_1_105633316M.xml
其余的都是这样的:
EODMESS_20140718_MTBX473286.xml
MSGCONF_20140410_109558667V.xml
我敢肯定有一个更简单的方式做到这一点,但这里是我到目前为止的代码:
@echo on
setlocal enabledelayedexpansion
Set "starttime=%time%"
pushd C:\temp\xmls
for /f %%a in ('dir /b/o:d *.xml') do (
call :ExtractDates %%a ret
echo %%a - !ret!
for /f "tokens=1" %%b in ("!ret!") do (
for /f "tokens=1-3 delims=/" %%c in ("%%b") do (
if not exist .\%%e md .\%%e
if not exist .\%%e\%%c md .\%%e\%%c
if %%b equ %%c/%%d/%%e (
echo moving %%~nxa to .\%%e\%%c
echo move %%~nxa .\%%e\%%c
pause
)
)
)
)
echo Start time: %starttime%
echo End time: %time%
popd
exit /b
:ExtractDates
@echo on
setlocal enabledelayedexpansion
Echo Starting ExtractDates
for %%a in (BALMIS ACCTV21 FEDOUT SWFTOUT) do (
if not errorlevel 1 (set t=3) else set t=2
Call :ExtractFunc %~1 %%a !t! ret
endlocal&set "%~2=!ret!"&exit /b 0
)
exit /b
:ExtractFunc
@echo on
setlocal
Echo Starting ExtractFunc
for /f "tokens=%3 delims=_" %%a in (
'echo %~1^|Findstr "%~2"'
) do (
if not errorlevel 1 (
endlocal&set "%~4=%%a"&exit /b 0
)
)
exit /b
问题是变量令牌没有返回正确的数字,我不知道为什么。任何建议感激。
感谢Magoo。你的代码比我的简洁得多,只需稍作调整,运行速度就会快得多。 – 2015-02-24 16:13:33