2015-02-24 60 views
0

我有一个包含近百万个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 

问题是变量令牌没有返回正确的数字,我不知道为什么。任何建议感激。

回答

1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir\t w o" 
PUSHD "%sourcedir%" 
FOR /f "tokens=1*delims=" %%a IN (
    'dir /b /a-d "%sourcedir%\*_*_*.xml" ' 
) DO SET "filename=%%a"&CALL :process 

POPD 

GOTO :EOF 

:process 
FOR /f "tokens=2,3,6delims=_" %%m IN ("%filename%") DO SET "date1=%%m"&SET "date2=%%n"&SET "whichdate=%%o" 
IF DEFINED whichdate SET "date1=%date2%" 
IF NOT DEFINED date2 GOTO :eof 
ECHO(MD .\%date1:~0,4%\%date1:~4,2% 
ECHO(MOVE "%filename%" .\%date1:~0,4%\%date1:~4,2%\ 
GOTO :EOF 

您需要更改sourcedir的设置以适合您的情况。

为了测试目的,所需的MD命令仅仅是ECHO验证命令是否正确后,将ECHO(MD更改为MD以实际创建目录。附加2>nul以抑制错误消息(例如,当目录已经存在时)

为了测试目的,所需的MOVE命令仅仅是ECHO确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。附加>nul抑制报告消息(例如。1 file moved

只需提取两个可能datestrings并使用第六令牌的存在信号,以选择用于产生目标目录的所述两个位置中的。如果没有第三个标记跳过(不符合指定的掩码)

然后选择date1所需的字段并执行一些子字符串。

+0

感谢Magoo。你的代码比我的简洁得多,只需稍作调整,运行速度就会快得多。 – 2015-02-24 16:13:33