找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34763|回复: 12

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

[复制链接]
发表于 2013-7-23 11:08:13 | 显示全部楼层 |阅读模式
一、材料条件和要求
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_四川省财政收支审计条例

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-7-23 13:06:30 | 显示全部楼层
仅针对你的示例 貌似样本中有非法字符  这样不能处理的
另 后缀名自己补上 你没有 我也没写
  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
复制代码
 楼主| 发表于 2013-7-23 17:54:51 | 显示全部楼层
回复 2# terse

没有通过测试。一段文件名也没有改动,不知问题出在哪?
还有:
"rid         value"的空格与文本中的不一致;
”原序号“如何提取也反映不出来。
发表于 2013-7-23 20:35:51 | 显示全部楼层
本帖最后由 terse 于 2013-7-23 20:37 编辑

回复 3# pan528
那就  “rid.*value”  其实 你也可以用文本里的 copy 过来
 楼主| 发表于 2013-7-23 22:36:48 | 显示全部楼层
回复 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
复制代码
发表于 2013-7-24 01:13:44 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2013-7-24 07:25:04 | 显示全部楼层
回复 6# terse

这次通过了!谢谢。

你的代码太漂亮了,简洁而效率高,慢慢学习了。
 楼主| 发表于 2013-7-24 10:59:34 | 显示全部楼层
回复 2# terse

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

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

2、文件名的顺序有误:
如:39747_73_69615_四川省财政收支审计条例
错为:39747_69615_73_四川省财政收支审计条例
发表于 2013-7-24 13:01:34 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2013-7-24 14:10:50 | 显示全部楼层
回复 9# terse

问题已排除,非常感谢!
 楼主| 发表于 2013-7-24 21:24:17 | 显示全部楼层
回复 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
复制代码
发表于 2013-7-24 21:56:11 | 显示全部楼层
不明白什么原因 此类代码本身就难通用
加入的什么目录  findstr /is  多个参数看看
 楼主| 发表于 2013-7-26 09:16:45 | 显示全部楼层
回复 12# terse

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

也许 win8 系统的DOS命令参数有新的变化?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 00:27 , Processed in 0.013866 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表