[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】请教数据文件按字段匹配出错的问题

【问题】
在假期中学习使用批处理对win2k os的安装光碟内的文件数据信息进行收集。

其中在下面的批处理代码中,有进行数据文件按字段进行匹配操作代码段(:MATCH标签)内。

因为数据文件比较大,在操作的过程中,完整的一个收集操作要进行1个多小时,因此希望对数据文件中已经匹配的数据列进行删除,从而加快收集的操作。(代码段就是match代码段内注释出来的部分)。

结果是:操作过程的时间没有明显的减少,但却出现匹配不正常的问题,表现就是应该正常匹配的数据列没有正常匹配与输出。

希望有经验的朋友指出语句中导致匹配出错的原因,与改进的方法。谢谢!!

附件中:请把match_error.txt改为match_error.rar后解压。
fi21.bat 为下面代码。在命令行中以 fi21.bat cadv 运行匹配操作。
cadvfi21.csv,cadvfi22.csv是两个供匹配测试用的数据文件。
cadvfi25.log是进行匹配操作用的基础文件。
cadvfi23.csv是未采用match段内注释语句的匹配结果。(正常)
cadvfi231.csv是采用了match段内注释语句的匹配结果。(不正常)
  1. REM Copy the compressed files from X: to temp
  2. REM Expand the compressed files and Gather the expanded files infomation and relationship.
  3. REM 使用fi25.log(expanding)信息进行抽取fi21.csv,fi22.csv内容。
  4. REM Date:[2008-10-05 17:19:09]  Author:nh_wzg
  5. ::File notes...
  6. ::fi21.md5:CD/ISO内文件在临时目录下压缩文件的MD5
  7. ::fi21.csv:CD/ISO内文件在临时目录下压缩文件的MD5、目录、路径、文件名、后缀等文件信息
  8. ::tfi21.csv:fi21.csv用于匹配操作用的中间文件
  9. ::fi22.md5:CD/ISO内文件在临时目录下压缩文件解压后的MD5
  10. ::fi22.csv:CD/ISO内文件在临时目录下压缩文件解压后的MD5、目录、路径、文件名、后缀等文件信息
  11. ::tfi22.csv:fi22.csv用于匹配操作用的中间文件
  12. ::fi23.csv:CD/ISO内文件在临时目录下压缩文件与解压文件相匹配后的MD5、目录、路径、文件名输出
  13. ::fi21.log:CD/ISO内文件在临时目录下压缩文件在被拷贝与删除时的信息记录
  14. ::fi22.log:CD/ISO内文件在临时目录下压缩文件解压时的信息记录
  15. ::fi23.log:CD/ISO内文件在临时目录下压缩文件(expanded)
  16. ::fi24.log:CD/ISO内文件在临时目录下压缩文件(copied)
  17. ::fi25.log:CD/ISO内文件在临时目录下压缩文件(expanding)
  18. ::fi26.log:CD/ISO内文件在临时目录下压缩文件(expanded与expanding进行文件名称匹配后的结果)
  19. ::dbid(0),md52(a),fullpath_filename(b),path(c),name(d),name2(e),ext2(f),size2(g),ts2(h),desc(i),tu(j),tc(k),
  20. ::,%%i(a),%%~fnxa(b),%%~dpa(c),%%~nxa(d),%%~na(e),%%~xa(f),%%~za(g),%%~ta(h),(i),(j),(k),>>fi_21.csv
  21. ::,%%i(p),%%~fnxa(q),%%~dpa(r),%%~nxa(s),%%~na(t),%%~xa(u),%%~za(v),%%~ta(w),(x),(y),(z),>>fi_22.csv
  22. :BEGIN
  23. @echo off
  24. cls&echo.
  25. Title [获取Windows 2k %1 CD压缩文件与解压后文件信息与对应关系]
  26. echo [获取Windows 2k %1 CD压缩文件与解压后文件信息与对应关系]
  27. echo.
  28. :INIT
  29. echo [批处理执行初始化(Batch Initializing ... )]
  30. echo.
  31. if "%2"=="b1" (goto normal1) else (goto init1)
  32. :INIT1
  33. set /a count=1
  34. :LOOP1
  35. if /i exist %cd%\temp (
  36.     rd /s /q %cd%\temp 2>nul
  37.     set /a count=count+1
  38. )
  39. if /i not exist %cd%\temp goto normal1
  40. if %count% lss 10 goto loop1
  41. if /i exist %cd%\temp (goto e1) else (goto normal1)
  42. :E1
  43. echo Initializing Failed ... %cd%\temp ... %count% &echo.
  44. goto end
  45. :NORMAL1
  46. goto match
  47. if exist %1fi21.md5 del/q %1fi21.md5
  48. if exist %1fi21.csv del/q %1fi21.csv
  49. if exist %1fi22.md5 del/q %1fi22.md5
  50. if exist %1fi22.csv del/q %1fi22.csv
  51. if exist %1fi23.csv del/q %1fi23.csv
  52. if exist %1fi21.log del/q %1fi21.log
  53. if exist %1fi22.log del/q %1fi22.log
  54. if exist %1fi23.log del/q %1fi23.log
  55. if exist %1fi24.log del/q %1fi24.log
  56. if exist %1fi25.log del/q %1fi25.log
  57. if exist %1tfi21.csv del/q %1tfi21.csv
  58. if exist %1tfi22.csv del/q %1tfi22.csv
  59. :COPYING
  60. set /p =[Copying the Compressed Files with Directories from CD ... <nul
  61. echo Copying the Compressed Files from CD.>%1fi21.log
  62. echo Date:%date% %time%>>%1fi21.log
  63. xcopy x:\*.*_ %cd%\temp\ /s /y |findstr "File(s)" >>%1fi21.log
  64. set /p =Done!]<nul
  65. echo.
  66. echo.
  67. :EXPANDING
  68. set /p =[Expanding the Compressed files ... <nul
  69. echo CD/ISO内文件在临时目录下压缩文件解压时的信息记录>%1fi22.log
  70. echo Date:%date% %time%>>%1fi22.log
  71. for /r %cd%\temp\ %%a in (*.*_) do expand -r %%a >>%1fi22.log
  72. set /p =Done!]<nul
  73. echo.
  74. echo.
  75. :MD51
  76. echo [Calculating the Compressed Files MD5 ... ]
  77. echo.
  78. fsum %cd%\TEMP\*.*_ %1fi21.md5 /r /i:dthure /o
  79. echo.
  80. echo [Calculating files MD5 Done!]
  81. echo.
  82. :CSV1
  83. set /p =[Gathering the Compressed files info CSV ... <nul
  84. echo dbid,md51,fullpath_filename,path,filename,name1,ext1,size1,ts1,desc,tu,tc,>%1fi21.csv
  85. for /f "skip=9 tokens=1* delims=* " %%i in (%1fi21.md5) do (
  86.     for /f "delims=" %%a in ("%cd%\temp\%%j") do (
  87.             echo ,%%i,%%~fnxa,%%~dpa,%%~nxa,%%~na,%%~xa,%%~za,%%~ta,,,,>>%1fi21.csv
  88.     )
  89. )
  90. set /p =Done!]<nul
  91. echo.
  92. echo.
  93. :CLEAN
  94. set /p =[Deleting the Compressed files ... <nul
  95. echo CD/ISO内文件在临时目录下压缩文件在被删除时的信息记录>>%1fi21.log
  96. echo Date:%date% %time%>>%1fi21.log
  97. del /q /f /s *.*_ >>%1fi21.log
  98. set /p =Done!]<nul
  99. echo.
  100. echo.
  101. :MD52
  102. echo [Calculating the Expanded Files MD5 ... ]
  103. echo.
  104. fsum %CD%\TEMP\ %1fi22.md5 /r /i:dthure /o
  105. echo.
  106. echo [Calculating the Expanded Files MD5 Done!]
  107. echo.
  108. :CSV2
  109. set /p =[Gathering the Expanded Files info CSV ... <nul
  110. echo dbid,md52,fullpath_filename,path,name,name2,ext2,size2,ts2,desc,tu,tc,>%1fi22.csv
  111. for /f "skip=9 tokens=1* delims=* " %%i in (%1fi22.md5) do (
  112.     for /f "delims=" %%a in ("%cd%\temp\%%j") do (
  113.             echo ,%%i,%%~fnxa,%%~dpa,%%~nxa,%%~na,%%~xa,%%~za,%%~ta,,,,>>%1fi22.csv
  114.     )
  115. )
  116. set /p =Done!]<nul
  117. echo.
  118. echo.
  119. :INIT2
  120. set /p =[生成含有expanded文件数目记录 ... <nul
  121. echo CD/ISO内文件在临时目录下压缩文件(expanded)>%1fi23.log
  122. echo Date:%date% %time%>>%1fi23.log
  123. findstr /i "expanded" %1fi22.log >>%1fi23.log
  124. set /p =Done!]<nul
  125. echo.
  126. echo.
  127. set /p =[生成含有copied文件数目记录 ... <nul
  128. echo CD/ISO内文件在临时目录下压缩文件(copied)>%1fi24.log
  129. echo Date:%date% %time%>>%1fi24.log
  130. findstr /i "copied" %1fi22.log >>%1fi24.log
  131. set /p =Done!]<nul
  132. echo.
  133. echo.
  134. set /p =[生成含有expanding文件数目记录 ... <nul
  135. echo CD/ISO内文件在临时目录下压缩文件(expanding)>%1fi25.log
  136. echo Date:%date% %time%>>%1fi25.log
  137. findstr /i "expanding" %1fi22.log >>%1fi25.log
  138. set /p =Done!]<nul
  139. echo.
  140. echo.
  141. :MATCH
  142. set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul
  143. copy /y %1fi21.csv %1tfi21.csv >nul
  144. copy /y %1fi22.csv %1tfi22.csv >nul
  145. echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv
  146. setlocal enabledelayedexpansion
  147. for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25.log) do (
  148.     set v1=%%l
  149.     set v2=%%m
  150.     for /f "skip=1 tokens=1-11 delims=," %%a in (%1tfi21.csv) do (
  151.         if /i %%l==%%b (
  152.         set aa=%%a
  153.         set bb=%%b
  154.         set cc=%%c
  155.         set dd=%%d
  156.         REM ----------------------------------------------------------------------
  157.         REM findstr /i /v /c:%%b, %1tfi21.csv >t21.csv
  158.         REM move /y t21.csv %1tfi21.csv
  159.         REM ----------------------------------------------------------------------
  160.         )
  161.     )
  162.     set v3=!v2:~0,-1!
  163.     for /f "skip=1 tokens=1-11 delims=," %%p in (%1tfi22.csv) do (
  164.         if /i !v3!==%%q (
  165.         set ss=%%s
  166.         set pp=%%p
  167.         set tt=%%t
  168.         set uu=%%u
  169.         set vv=%%v
  170.         set ww=%%w
  171.         set yy=%%y
  172.         set zz=%%z
  173.         REM ----------------------------------------------------------------------
  174.         REM findstr /i /v /c:%%q, %1tfi22.csv >t22.csv
  175.         REM move /y t22.csv %1tfi22.csv
  176.         REM ----------------------------------------------------------------------
  177.         )
  178.     )
  179.     echo !aa!,!bb!,!cc!,!dd!,!ss!,!pp!,!tt!,!uu!,!vv!,!ww!,!yy!,!zz!,>>%1fi23.csv
  180.     set aa=
  181.     set bb=
  182.     set cc=
  183.     set dd=
  184.     set ss=
  185.     set pp=
  186.     set tt=
  187.     set uu=
  188.     set vv=
  189.     set ww=
  190.     set yy=
  191.     set zz=
  192. )
  193. endlocal
  194. set /p =Done!]<nul
  195. echo.
  196. echo.
  197. :END
  198. pause::[Press Any Key to Exit ... ]&echo.
复制代码

[ 本帖最后由 nh_wzg 于 2008-10-13 14:38 编辑 ]

【原因】
1.对于所处理数据文件内的元数据单元的边界没有进行清晰的定义。
2.对findstr进行模式匹配时,对上一点所导致的错误认识不深。

【修改】
根据csv文件的定义,在匹配项定义后面增加一个定义数据边界的“,”即可获得正确的结果。

[ 本帖最后由 nh_wzg 于 2008-10-13 14:34 编辑 ]

TOP

返回列表