标题: [文本处理] 【已解决】批处理如何提取文件内的字符重命名? [打印本页]
作者: 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
仅针对你的示例 貌似样本中有非法字符 这样不能处理的
另 后缀名自己补上 你没有 我也没写- @echo off& setlocal enabledelayedexpansion
- set find=c:"rid value" /c:"文件编号:" /c:"<font color=maroon>"
- for /f "tokens=1* delims=:" %%i in ('findstr /i%find% *.') do (
- if "%%i" neq "%~nx0" (
- for /f "tokens=2,5 delims=<>:" %%a in ("%%j") do (
- if "%%b" neq "" (
- if defined str (
- set "str=!str!_%%b"
- ren "%%i" "!str!"
- set "str="
- ) else set "str=%%b_!s!"
- ) else for /f "tokens=4 delims==>" %%a in ("%%j") do set "s=%%a"
- )
- )
- )
- 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、批处理冗长而效率低。
你能帮助改进一下吗?- @echo off
- title 重命名
-
- set Folder=not
- echo 正在提取原序号,请稍候 ...
- for /f "tokens=1-5* delims==&" %%a in ('dir/s /b /on %Folder%\*.*') do (
- ren "%%a=%%b&%%c=%%d&%%e=*" "%%d.txt"
- )
-
- echo 正在提取文件类,请稍候 ...
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir/s /b /on %Folder%\*.*') do (
- for /f "tokens=1,2 delims=:" %%b in ('findstr /n "rid.*value" "%Folder%\%%~nxa"') do (
- set m=%%c
- ren "%Folder%\%%~nxa" "%%~na_!m:~36,-1!.txt"
- )
- )
- endlocal
-
- set row=文件编号:
- echo 正在给指定字符前加入回车,请稍候 ...
- setlocal enabledelayedexpansion
- for %%a in (%Folder%\*.txt) do (
- set h=^
-
-
- (for /f "delims=" %%b in (%%a) do (
- set tmp=%%b
- for %%i in ("!h!") do echo;!tmp:%row%=%%i%row%!
- )
- )>%Folder%\%%~na.pan
- del %Folder%\%%~na.txt
- )
- endlocal
-
- echo 正在提取文件名,请稍候 ...
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir/s /b /on %Folder%\*.pan') do (
- for /f "tokens=1,2 delims=:" %%b in ('findstr /n "%row%" "%Folder%\%%~nxa"') do (
- set m=%%c
- ren "%Folder%\%%~nxa" "%%~na_!m:~6,-17!.txt"
- )
- )
- endlocal
-
- set row=
- set row=maroon
- echo 正在给指定字符前加入回车,请稍候 ...
- setlocal enabledelayedexpansion
- for %%a in (%Folder%\*.txt) do (
- set h=^
-
-
- (for /f "delims=" %%b in (%%a) do (
- set tmp=%%b
- for %%i in ("!h!") do echo;!tmp:%row%=%%i%row%!
- )
- )>%Folder%\%%~na.pan
- del %Folder%\%%~na.txt
- )
- endlocal
-
- echo 正在提取文件名,请稍候 ...
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir/s /b /on %Folder%\*.pan') do (
- for /f "tokens=1,2 delims=:" %%b in ('findstr /n "%row%" "%Folder%\%%~nxa"') do (
- set m=%%c
- ren "%Folder%\%%~nxa" "%%~na_!m:~8,-21!.txt"
- )
- )
- endlocal
-
- pause
- goto:eof
复制代码
作者: terse 时间: 2013-7-24 01:13
回复 5# pan528
确认你这里 “文件编号:” 后面的 ":" 因为给的范例是: 而不是 : 所以 分割符应该是":"
我这里测试你的范例情况是可以的 不过因为提取内容含有 ...../1号决定对....... 这里 的"/" 不能为文件名
另 和你说的后缀名自己添加 写为 *.*
修改下 对 "/" 暂先这样处理 没处理其他特殊字符
另: 文件名格式的不同可能运行不正常
测试代码- @echo off& setlocal enabledelayedexpansion
- set find=c:"rid value" /c:"文件编号:" /c:"<font color=maroon>"
- for /f "tokens=1* delims=:" %%i in ('findstr /i%find% *.*') do (
- if "%%i" neq "%~nx0" (
- for /f "tokens=2,5 delims=<>:" %%a in ("%%j") do (
- if "%%b" neq "" (
- if defined str (
- for /f "tokens=4 delims==&" %%k in ("%%i") do ren "%%i" "%%k_!str:/=!_%%b"
- set "str="
- ) else set "str=%%b_!s!"
- ) else for /f "tokens=4 delims==>" %%a in ("%%j") do set "s=%%a"
- )
- )
- )
- 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 - @echo off& setlocal enabledelayedexpansion
- for /f "delims=U" %%a in ('cmd /u /c echo 唉') do (
- set find=c:"rid%%a value" /c:"文件编号:" /c:"<font color=maroon>"
- )
- for /f "tokens=1* delims=:" %%i in ('findstr /i%find% *.*') do (
- if "%%i" neq "%~nx0" (
- for /f "tokens=2,4,5,8 delims=<>" %%a in ("%%j") do (
- if "%%b" neq "" (
- if "%%d" == "" (
- set "s=%%b"
- set "str=!str!_!s:*:=!"
- ) else for /f "tokens=4 delims==&" %%k in ("%%i") do ren "%%i" "%%k_!str!_%%c"
- ) else for /f "tokens=4 delims==" %%k in ("%%a") do set "str=%%k"
- )
- )
- )
- pause
复制代码
作者: pan528 时间: 2013-7-24 14:10
回复 9# terse
问题已排除,非常感谢!
作者: pan528 时间: 2013-7-24 21:24
回复 9# terse
又出了一个怪事:
批命令放在同一目录下运行正常。
加入目录,出现序号重叠并出错,不知原因何在?
请高手指点。
我修改的代码如下:- @echo off& setlocal enabledelayedexpansion
- for /f "delims=U" %%a in ('cmd /u /c echo 唉') do (
- set find=c:"rid%%a value" /c:"文件编号:" /c:"<font color=maroon>"
- )
- for /f "tokens=1* delims=:" %%i in ('findstr /i%find% "Colon\*.*"') do (
- if "%%i" neq "%~nx0" (
- for /f "tokens=2,4,5,8 delims=<>" %%a in ("%%j") do (
- if "%%b" neq "" (
- if "%%d" == "" (
- set "s=%%b"
- set "str=!str!_!s:*:=!"
- ) else for /f "tokens=4 delims==&" %%k in ("%%i") do ren "%%i" "%%k_!str!_%%c.txt"
- ) else for /f "tokens=4 delims==" %%k in ("%%a") do set "str=%%k"
- )
- )
- )
- pause
复制代码
作者: terse 时间: 2013-7-24 21:56
不明白什么原因 此类代码本身就难通用
加入的什么目录 findstr /is 多个参数看看
作者: pan528 时间: 2013-7-26 09:16
回复 12# terse
试了一下,出现上述情况的,发生在 win8 系统下,在 win7 系统下是正常的。
也许 win8 系统的DOS命令参数有新的变化?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |