Board logo

标题: [文本处理] 【已解决】批处理如何提取文件内的字符重命名? [打印本页]

作者: pan528    时间: 2013-7-23 11:08     标题: 【已解决】批处理如何提取文件内的字符重命名?

一、材料条件和要求
1、保留原文件名中的序号;
2、根据文本中的定位字符行(有的文本定位字符行序可能不同,但定位字符是唯一的)找到关键字,并提取字符重命名;
3、文件名格式:原序号_文件类号_文件编号_文件名

难点可能是Tab符号、特殊符号的处理。

二、材料示例
如:
1、文件类行及定位字符“rid         value”、关键字符“73”
        <input type=hidden name=rid         value=73>
2、文件编号行及定位字符“文件编号:”、关键字符“69615”
<tr><Td align=left style="font-size:14px"><font color=black style="font-size:10px">文件编号:69615</font></td></tr>
3、文件名行及定位字符“maroon”、关键字符“73”
<tr><Td align=center style="font-size:14px"><b><font color=maroon>四川省财政收支审计条例</font></b></td></tr>

三、重命名后效果
39747_73_69615_四川省财政收支审计条例
作者: terse    时间: 2013-7-23 13:06

仅针对你的示例 貌似样本中有非法字符  这样不能处理的
另 后缀名自己补上 你没有 我也没写
  1. @echo off& setlocal enabledelayedexpansion
  2. set find=c:"rid value" /c:"文件编号:" /c:"<font color=maroon>"
  3. for /f "tokens=1* delims=:" %%i in ('findstr /i%find% *.') do (
  4.     if "%%i" neq "%~nx0" (
  5.        for /f "tokens=2,5 delims=<>:" %%a in ("%%j") do (
  6.            if "%%b" neq  "" (
  7.               if defined str (
  8.                  set "str=!str!_%%b"
  9.                  ren "%%i" "!str!"
  10.                  set "str="
  11.               ) else set "str=%%b_!s!"
  12.            ) else for /f "tokens=4 delims==>" %%a in ("%%j") do set "s=%%a"
  13.        )
  14.     )
  15. )
  16. pause
复制代码

作者: pan528    时间: 2013-7-23 17:54

回复 2# terse

没有通过测试。一段文件名也没有改动,不知问题出在哪?
还有:
"rid         value"的空格与文本中的不一致;
”原序号“如何提取也反映不出来。
作者: terse    时间: 2013-7-23 20:35

本帖最后由 terse 于 2013-7-23 20:37 编辑

回复 3# pan528
那就  “rid.*value”  其实 你也可以用文本里的 copy 过来
作者: pan528    时间: 2013-7-23 22:36

回复 4# terse

仍没有通过测试。

估计:

<tr><Td align=left style="font-size:14px"><font color=black style="font-size:10px">文件编号:151072</font></td></tr>

其中的“:”符号会拦断,即,只能显示到“<tr><Td align=left style="font-size”,就会中断,

我用在定位符前加入回车的方法,可以顺利提取关键字符,但是:

1、破坏了原文件;
2、批处理冗长而效率低。

你能帮助改进一下吗?
  1. @echo off
  2. title 重命名
  3. set Folder=not
  4. echo 正在提取原序号,请稍候 ...
  5. for /f "tokens=1-5* delims==&" %%a in ('dir/s /b /on %Folder%\*.*') do (
  6. ren "%%a=%%b&%%c=%%d&%%e=*" "%%d.txt"
  7. )
  8. echo 正在提取文件类,请稍候 ...
  9. setlocal enabledelayedexpansion
  10. for /f "delims=" %%a in ('dir/s /b /on %Folder%\*.*') do (
  11. for /f "tokens=1,2 delims=:" %%b in ('findstr /n "rid.*value" "%Folder%\%%~nxa"') do (
  12. set m=%%c
  13. ren "%Folder%\%%~nxa" "%%~na_!m:~36,-1!.txt"
  14. )
  15. )
  16. endlocal
  17. set row=文件编号:
  18. echo 正在给指定字符前加入回车,请稍候 ...
  19. setlocal enabledelayedexpansion
  20. for %%a in (%Folder%\*.txt) do (
  21. set h=^
  22. (for /f "delims=" %%b in (%%a) do (
  23. set tmp=%%b
  24. for %%i in ("!h!") do echo;!tmp:%row%=%%i%row%!
  25. )
  26. )>%Folder%\%%~na.pan
  27. del %Folder%\%%~na.txt
  28. )
  29. endlocal
  30. echo 正在提取文件名,请稍候 ...
  31. setlocal enabledelayedexpansion
  32. for /f "delims=" %%a in ('dir/s /b /on %Folder%\*.pan') do (
  33. for /f "tokens=1,2 delims=:" %%b in ('findstr /n "%row%" "%Folder%\%%~nxa"') do (
  34. set m=%%c
  35. ren "%Folder%\%%~nxa" "%%~na_!m:~6,-17!.txt"
  36. )
  37. )
  38. endlocal
  39. set row=
  40. set row=maroon
  41. echo 正在给指定字符前加入回车,请稍候 ...
  42. setlocal enabledelayedexpansion
  43. for %%a in (%Folder%\*.txt) do (
  44. set h=^
  45. (for /f "delims=" %%b in (%%a) do (
  46. set tmp=%%b
  47. for %%i in ("!h!") do echo;!tmp:%row%=%%i%row%!
  48. )
  49. )>%Folder%\%%~na.pan
  50. del %Folder%\%%~na.txt
  51. )
  52. endlocal
  53. echo 正在提取文件名,请稍候 ...
  54. setlocal enabledelayedexpansion
  55. for /f "delims=" %%a in ('dir/s /b /on %Folder%\*.pan') do (
  56. for /f "tokens=1,2 delims=:" %%b in ('findstr /n "%row%" "%Folder%\%%~nxa"') do (
  57. set m=%%c
  58. ren "%Folder%\%%~nxa" "%%~na_!m:~8,-21!.txt"
  59. )
  60. )
  61. endlocal
  62. pause
  63. goto:eof
复制代码

作者: terse    时间: 2013-7-24 01:13

回复 5# pan528
确认你这里 “文件编号:” 后面的 ":"  因为给的范例是:  而不是 :  所以 分割符应该是":"
我这里测试你的范例情况是可以的 不过因为提取内容含有  ...../1号决定对.......   这里 的"/" 不能为文件名
另 和你说的后缀名自己添加 写为  *.*
修改下  对 "/" 暂先这样处理 没处理其他特殊字符
另: 文件名格式的不同可能运行不正常

测试代码
  1. @echo off& setlocal enabledelayedexpansion
  2. set find=c:"rid value" /c:"文件编号:" /c:"<font color=maroon>"
  3. for /f "tokens=1* delims=:" %%i in ('findstr /i%find% *.*') do (
  4.     if "%%i" neq "%~nx0" (
  5.        for /f "tokens=2,5 delims=<>:" %%a in ("%%j") do (
  6.            if "%%b" neq  "" (
  7.               if defined str (
  8.                  for /f "tokens=4 delims==&" %%k in ("%%i") do ren "%%i" "%%k_!str:/=!_%%b"
  9.                  set "str="
  10.               ) else set "str=%%b_!s!"
  11.            ) else for /f "tokens=4 delims==>" %%a in ("%%j") do set "s=%%a"
  12.        )
  13.     )
  14. )
  15. pause
复制代码

作者: pan528    时间: 2013-7-24 07:25

回复 6# terse

这次通过了!谢谢。

你的代码太漂亮了,简洁而效率高,慢慢学习了。
作者: pan528    时间: 2013-7-24 10:59

回复 2# terse

经深度测试,发现两个小问题:

1、带冒号的文件名冒号之后会被截去。如:
全国人民代表大会常务委员会关于修改《中华人民共和国中外合资经营企业所得税法》的决定 附:修正本
只保留:
全国人民代表大会常务委员会关于修改《中华人民共和国中外合资经营企业所得税法》的决定 附

2、文件名的顺序有误:
如:39747_73_69615_四川省财政收支审计条例
错为:39747_69615_73_四川省财政收支审计条例
作者: terse    时间: 2013-7-24 13:01

回复 8# pan528
  1. @echo off& setlocal enabledelayedexpansion
  2. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do (
  3.     set find=c:"rid%%a value" /c:"文件编号:" /c:"<font color=maroon>"
  4. )
  5. for /f "tokens=1* delims=:" %%i in ('findstr /i%find% *.*') do (
  6.     if "%%i" neq "%~nx0" (
  7.        for /f "tokens=2,4,5,8 delims=<>" %%a in ("%%j") do (
  8.            if "%%b" neq "" (
  9.               if "%%d" == "" (
  10.                  set "s=%%b"
  11.                  set "str=!str!_!s:*:=!"
  12.               ) else for /f "tokens=4 delims==&" %%k in ("%%i") do ren "%%i" "%%k_!str!_%%c"
  13.            ) else for /f "tokens=4 delims==" %%k in ("%%a") do set "str=%%k"
  14.        )
  15.     )
  16. )
  17. pause
复制代码

作者: pan528    时间: 2013-7-24 14:10

回复 9# terse

问题已排除,非常感谢!
作者: pan528    时间: 2013-7-24 21:24

回复 9# terse

又出了一个怪事:

批命令放在同一目录下运行正常。

加入目录,出现序号重叠并出错,不知原因何在?

请高手指点。

我修改的代码如下:
  1. @echo off& setlocal enabledelayedexpansion
  2. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do (
  3.     set find=c:"rid%%a value" /c:"文件编号:" /c:"<font color=maroon>"
  4. )
  5. for /f "tokens=1* delims=:" %%i in ('findstr /i%find% "Colon\*.*"') do (
  6.     if "%%i" neq "%~nx0" (
  7.        for /f "tokens=2,4,5,8 delims=<>" %%a in ("%%j") do (
  8.            if "%%b" neq "" (
  9.               if "%%d" == "" (
  10.                  set "s=%%b"
  11.                  set "str=!str!_!s:*:=!"
  12.               ) else for /f "tokens=4 delims==&" %%k in ("%%i") do ren "%%i" "%%k_!str!_%%c.txt"
  13.            ) else for /f "tokens=4 delims==" %%k in ("%%a") do set "str=%%k"
  14.        )
  15.     )
  16. )
  17. pause
复制代码

作者: terse    时间: 2013-7-24 21:56

不明白什么原因 此类代码本身就难通用
加入的什么目录  findstr /is  多个参数看看
作者: pan528    时间: 2013-7-26 09:16

回复 12# terse

试了一下,出现上述情况的,发生在 win8 系统下,在 win7 系统下是正常的。

也许 win8 系统的DOS命令参数有新的变化?




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2