标题: [文本处理] [已解决]批处理怎样批量提取TXT文件第一行对文件进行改名? [打印本页]
作者: zxzl 时间: 2010-6-18 11:19 标题: [已解决]批处理怎样批量提取TXT文件第一行对文件进行改名?
如题,一个目录下有大量TXT文件,文件名可能是1.txt, 2.txt ,3.txt…… 每个TXT文件的内容格式如下:
这是文件标题这是文件标题
这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容。
现在想把每个TXT文件改名,即用每个TXT文件的第一行内容作为标题,同时删除内容中的第一行和第二行空行,处理后TXT文件内容变成:
这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容。
请问批处理该怎么写呢
[ 本帖最后由 zxzl 于 2010-6-21 23:57 编辑 ]
作者: hanyeguxing 时间: 2010-6-18 11:58
- @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
- )
复制代码
[ 本帖最后由 hanyeguxing 于 2010-6-18 13:26 编辑 ]
作者: zxzl 时间: 2010-6-18 12:47
你好孤星,我运行了你给的批处理之后,TXT文件的标题可以成功改名,但是TXT文件内容的原第1、2行还在并没有删除?
作者: Batcher 时间: 2010-6-18 12:49
批处理更改文本文件名为该文件的第一行内容
http://bbs.bathome.net/thread-287-1-1.html
作者: hanyeguxing 时间: 2010-6-18 12:58
原帖由 zxzl 于 2010-6-18 12:47 发表
你好孤星,我运行了你给的批处理之后,TXT文件的标题可以成功改名,但是TXT文件内容的原第1、2行还在并没有删除?
忘记加输出了,已在2楼修改。
作者: zxzl 时间: 2010-6-18 13:13
试了下修改过的,可是运行后把当前文件夹下的所有TXT文件都删除了
作者: zxzl 时间: 2010-6-18 14:08
又试了一下还是不行,运行后还是全部删除,只生成一个$文件
作者: Seter 时间: 2010-6-18 16:48
我觉得用set/p=<和more+2会好一点
作者: zxzl 时间: 2010-6-18 17:28
原帖由 Seter 于 2010-6-18 16:48 发表
我觉得用set/p=
能否给个完整的代码呢?
作者: sgaizxt001 时间: 2010-6-18 21:07
我感觉在这两句前加个PAUSE就可以
ren $ "!a!.txt"
del /q /f "%%a"
我写代码的时候遇到这两个命令时要加pause暂停一下,然后才能修改成功。
作者: 随风 时间: 2010-6-18 21:33 标题: 回复 2楼 的帖子
給2楼代码提点建议
1、ren 重命名文件最好不要用for直接遍历文件,会有bug
2、既然把setlocal enabledelayedexpansion放在for内部,说明考虑到文件内容和文件名特殊符号的问题,那么就不应该再是echo.%%b而是应该先set num=%%b再echo.!num!,同时 del 当然也不能 %%a 而应先赋值給变量,或者把del语句放在 endlocal 后面。
3、楼主说还是不行,(我也没测试)但估计是()包起for再>$ 所致,建议改成echo.!Num!>>$或者給for再加对()试试。
((for /F "usebackq delims=" %%b in ("%%a") do (
if defined b (echo.%%b) else set "a=%%b"
set b==
)))>$
未测试。。。只是好像依稀记得遇到过此问题。
作者: zxzl 时间: 2010-6-18 22:54
原帖由 随风 于 2010-6-18 21:33 发表
給2楼代码提点建议
1、ren 重命名文件最好不要用for直接遍历文件,会有bug
2、既然把setlocal enabledelayedexpansion放在for内部,说明考虑到文件内容和文件名特殊符号的问题,那么就不应该再是echo.%%b而是应该先 ...
不知随风版主能否给个完善点的代码?我对编程这方面不太懂,谢谢了
作者: sgaizxt001 时间: 2010-6-18 23:36
- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.txt) do (
- for /f "tokens=1,* delims=:" %%a in ('findstr /n .* "%%a"') do (
- if %%a equ 1 set name=%%b
- if %%a geq 3 (echo.%%b >>!name!.txt)
- )
- del /q /f "%%a"
- )
- endlocal
- pause
复制代码
不知道是不是这样呢,我测试是可以的
作者: 随风 时间: 2010-6-18 23:47
13楼同样未考虑到文件名及内容含!号的问题,并且如此使用findstr对效率是个大影响,如果文件数量过多的话。且未考虑到以冒号开头的行
8楼的思路- @echo off
- for %%a in (*.txt) do (
- set /p num=<"%%a"
- set "wjm=%%~nxa"
- setlocal enabledelayedexpansion
- more +2 "!wjm!">tem
- move tem "!num!.txt"
- del /q "!wjm!"
- endlocal
- )
- pause
复制代码
[ 本帖最后由 随风 于 2010-6-19 01:21 编辑 ]
作者: sgaizxt001 时间: 2010-6-19 05:39
为什么不直接
more +2 "!wjm!">"!num!.txt"
del /q "%%a"
可以不用临时文件吧。
还有一个问题使用>,但是假如有两个以上的文本第一行相同但内容可能不同(比如是一个完整的文章分成了几个文本)时该怎么办呢
作者: 随风 时间: 2010-6-19 12:07
原帖由 sgaizxt001 于 2010-6-19 05:39 发表
为什么不直接
more +2 "!wjm!">"!num!.txt"
del /q "%%a"
可以不用临时文件吧。
是哦,看来我最近脑袋短路的厉害啊~
作者: zxzl 时间: 2010-6-19 14:41
偶真的很郁闷,楼上诸位高手给出的代码为什么没有一个可以成功运行的?
作者: sgaizxt001 时间: 2010-6-19 20:28
难道是你文本编码的问题?
作者: Batcher 时间: 2010-6-19 21:08 标题: 回复 17楼 的帖子
能否把其中一个文件用附件的形式传上来看看?
作者: lshhjx 时间: 2010-6-20 12:23
原帖由 hanyeguxing 于 2010-6-18 11:58 发表
@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==
))>$
re ...
在我机子上我用这段代码测试了一下,发现并不能完成楼主需要的功能,提示“存在一个重名文件,或是找不到文件”,不知是怎么回事。
作者: BowAngel 时间: 2010-6-21 13:01
可以用VBS实现楼主所要的结果,但不知道在这个版块发VBS代码是不是不太合适。。。。。。
作者: BowAngel 时间: 2010-6-21 15:23
翻阅老帖,看来可以用VBS解决批处理遇到的问题,哈哈,放心了O(∩_∩)O~- set fso=createobject("scripting.filesystemobject")
- set fd=fso.getfolder(".")
- fpath=fd.path
- set fo=fso.getfolder(fpath)
- set fc=fo.files
- for each f in fc
- ext=f.type
- if ext="文本文档" then
- strtext=""
- set rfile=fso.opentextfile(f)
- fname=rfile.readline
- rfile.skipline
- do until rfile.atendofstream=true
- strline=rfile.readline
- strtext=strtext&strline&vbcrlf
- loop
- rfile.close
- set wfile=fso.opentextfile(f,2)
- wfile.write strtext
- wfile.close
- newname=fname&".txt"
- f.name=newname
- end if
- next
复制代码
如果txt文件较多,可能会等待几秒
[ 本帖最后由 BowAngel 于 2010-6-21 15:28 编辑 ]
作者: zxzl 时间: 2010-6-21 15:41
感谢楼上,不过还是有点问题,您可以新建几个文件试一下
作者: BowAngel 时间: 2010-6-21 15:57
原帖由 zxzl 于 2010-6-21 15:41 发表
感谢楼上,不过还是有点问题,您可以新建几个文件试一下
什么问题?
作者: zxzl 时间: 2010-6-21 16:26
不能全部处理,而且有错误提示,你可以试一下
作者: 73yexs4f8qzk 时间: 2010-6-21 19:49
- @echo off
- for /f "delims=" %%a in ('dir /a:-d /b *.txt') do (
- set OldName=%%a
- set /p NewName=<"%%a"
- SetLocal EnableDelayedExpansion
- more +2 "!OldName!" > "!NewName!.txt"
- EndLocal
- del /a /f "%%a"
- )
复制代码
作者: Batcher 时间: 2010-6-21 20:33 标题: 回复 25楼 的帖子
能否把你的数据更新到顶楼?
作者: zxzl 时间: 2010-6-21 23:56
26楼的代码可以实现这个功能了,谢谢各位兄弟
作者: 810126769 时间: 2013-8-23 17:05
回复 26# 73yexs4f8qzk
真的太巧妙了!佩服!
作者: 810126769 时间: 2013-8-23 17:20
回复 26# 73yexs4f8qzk
这句代码不好理解啊:
set /p NewName=<"%%a"
我的理解是NewName这个变量得到的是%%a代表的txt文件的全部内容。可是在下一句中:
more +2 "!OldName!" > "!NewName!.txt"
从这里句代码来看的话,NewName这个变量应该是%%a代表的文本文件中第一行的内容啊。可是没有看到有一句从%%a中提取第一行内容的代码啊?
有没有谁能理解这句代码,帮我解释一下,谢谢!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |