标题: [文本处理] [已解决]批处理提取第一行为文本标题的扩展 [打印本页]
作者: chenyanroger 时间: 2011-7-19 21:07 标题: [已解决]批处理提取第一行为文本标题的扩展
本帖最后由 chenyanroger 于 2011-7-26 21:49 编辑
提取第一行作为文本标题,并删除第一行,我已经找到代码了。
我问下,如果我有一个文件夹,文本第一行内容相同,标题怎么取增量?
比如一个文件夹里有有如下 文本
文本1
第一行:title1
其余内容:content 1-1
文本2
第一行:title1
其余内容:content 1-2
文本3
第一行:title2
其余内容:content 2-1
文本4
第一行:title2
其余内容:content 2-2
。。。。
改写第一行为该文本标题,并删除第一行,且标题相同的情况下需要取增量1,2,3.。。
作者: cjiabing 时间: 2011-7-20 13:41
改名会不?
ren 1.txt 2.txt
有重复的时候添加一个标记:
if exist 2.txt ren 1.txt new_2.txt
如果有很多重复,再添加数字标记……
作者: chenyanroger 时间: 2011-7-20 20:12
本帖最后由 chenyanroger 于 2011-7-20 22:13 编辑
- @echo off
- for %%a in (*.txt) do (
- setlocal enabledelayedexpansion
- (for /F "usebackq delims=" %%b in ("%%a") do (
- if defined b (echo.%%b) else set "a=%%b"
- set b==
- ))>$
- ren $ "!a!.txt"
- del /q /f "%%a"
- Endlocal
- )
复制代码
请教添加在哪儿?
我一个文件夹里有 500个 内容第一行为 title1 的文本,500个内容第一行为title2的文本。 甚至上万个。
作者: cjiabing 时间: 2011-7-20 22:21
你哪里来的代码?自己写的?
还有删掉第一行?也就是用作标题的那一行?
不懂得你是不是要这样- @echo off
- set nb=0
- for %%a in (*.txt) do (
- setlocal enabledelayedexpansion
- (for /F "usebackq delims=" %%b in ("%%a") do (
- if defined b (echo.%%b) else (set /a nb+=1
- set "a=!nb!_%%b")
- set b==
- ))>$
- ren $ "!a!.txt"
- del /q /f "%%a"
- Endlocal
- )
复制代码
作者: CrLf 时间: 2011-7-20 23:53
本帖最后由 CrLf 于 2011-7-23 20:08 编辑
提高兼容性和准确率:- @echo off>nul 2>nul 3>nul 4>nul
- for /l %%a in (1 1 8) do (for /l %%b in (1 1 7) do echo asfdf:%random%)>%%a.txt
- for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
- set a=
- (for /f "useback delims=" %%b in ("%%a") do (
- if defined a (echo;%%b) else (
- for /f delims^=\/:*?^<^>^|^" %%c in ("%%b") do set "a=%%c"
- if not defined a echo;%%b
- )
- ))>$
- if not defined a set "a=%%~na"
- rem 获取文件名和输出文本
-
- set $=!a!#
- set len=0
- for %%a in (32 16 8 4 2 1) do (
- if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
- )
- rem 计算文件名长度
-
- set n=
- setlocal enabledelayedexpansion
- for %%b in (!len!) do (
- for %%c in ("!a!*.tx$") do (
- for /f %%d in ("!n!") do endlocal&set n=%%~d
- set test=%%~nc
- setlocal enabledelayedexpansion
- rem 转换变量
-
- for /f "tokens=1-3 delims=0123456789" %%d in (
- "!test:~%%b!\"
- ) do (
- if %%f neq \ set /a n-=1
- )
- rem 排除文件名干扰
- )
- )
- move $ "!a!!n!.tx$"
- Endlocal
- )
- del /f /a *.txt
- ren *.tx$ *.txt
- rem 取代原有的txt
- pause>con
复制代码
作者: chenyanroger 时间: 2011-7-23 18:10
cjiabing 版主:用你的方法,貌似会出现找不到文件名,crlf版主的代码可以很好执行,但是有一个小问题如下:
Crlf版主,用你的方法 在第一行里如果包含了 : 则 出现从:至最后均不出现在标题中。
怎样才能避免这个情况?
不好意思,我只懂得用批处理,不懂命令怎么写。
作者: CrLf 时间: 2011-7-23 20:25
逻辑错误,已经修改
作者: chenyanroger 时间: 2011-7-23 22:41
逻辑错误,已经修改
CrLf 发表于 2011-7-23 20:25
经测试,还是不行,有冒号的自动截断了。
作者: CrLf 时间: 2011-7-24 12:53
回复 8# chenyanroger
“\/:*?<>|" ”这几个字符本来就是不允许出现在文件名中的,碰到含有此字符的行,究竟是跳过呢?还是截断呢?还是替换呢?
作者: chenyanroger 时间: 2011-7-24 15:24
不好意思,版主,原谅我这个菜鸟吧。能否帮我修改一下代码,用- 代替 ?
作者: CrLf 时间: 2011-7-24 21:51
写这么长是为了尽可能提高兼容性:- @echo off>nul 2>nul 3>nul 4>nul
- for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
- set a=
- (for /f "useback delims=" %%b in ("%%a") do (
- if defined a (echo;%%b) else (
- set a=%%b
-
- setlocal enabledelayedexpansion
- set a=!a:?=-!
- for %%c in (\ / : ^< ^> ^| ^") do if defined a set a=!a:%%c=-!
- for /f "tokens=1* delims=*" %%c in ("!a!") do (
- for /f "delims=" %%e in ("!a!") do (
- endlocal&set a=%%e
- if "%%d" neq "" (
- setlocal enabledelayedexpansion
- for /l %%a in (0 1 63) do (
- if "!a:~%%a,1!"=="*" (
- set "m=!m!-"
- ) else set "m=!m!!a:~%%a,1!"
- )
- ) else setlocal enabledelayedexpansion
- )
- )
- for /f "delims=" %%c in ("!a!") do endlocal&set a=%%c
- rem 替换特殊字符为-
-
- if not defined a echo;%%b
- )
- ))>$
- if not defined a set "a=%%~na"
- rem 获取文件名和输出文本
-
- set $=!a!#
- set len=0
- for %%a in (32 16 8 4 2 1) do (
- if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
- )
- rem 计算文件名长度
-
- set n=
- setlocal enabledelayedexpansion
- for %%b in (!len!) do (
- for %%c in ("!a!*.tx$") do (
- for /f %%d in ("!n!") do endlocal&set n=%%~d
- set test=%%~nc
- setlocal enabledelayedexpansion
- rem 转换变量
-
- for /f "tokens=1-3 delims=0123456789" %%d in (
- "!test:~%%b!\"
- ) do (
- if %%f neq \ set /a n-=1
- )
- rem 排除文件名干扰
- )
- )
- move $ "!a!!n!.tx$"
- endlocal
- )
- del /f /a *.txt
- ren *.tx$ *.txt
- :: 取代原有的txt
- pause>con
复制代码
总结:批处理中的 * 和 ! 真蛋疼
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |