[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理怎样批量提取TXT文件第一行对文件进行改名?

如题,一个目录下有大量TXT文件,文件名可能是1.txt, 2.txt ,3.txt……  每个TXT文件的内容格式如下:

这是文件标题这是文件标题

这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容。


现在想把每个TXT文件改名,即用每个TXT文件的第一行内容作为标题,同时删除内容中的第一行和第二行空行,处理后TXT文件内容变成:

这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容。


请问批处理该怎么写呢

[ 本帖最后由 zxzl 于 2010-6-21 23:57 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

  1. @echo off
  2. for %%a in (*.txt) do (
  3.    setlocal enabledelayedexpansion
  4.    (for /F "usebackq delims=" %%b in ("%%a") do (
  5.       if defined b (echo.%%b) else set "a=%%b"
  6.       set b==
  7.    ))>$
  8.    ren $ "!a!.txt"
  9.    del /q /f "%%a"
  10.    Endlocal
  11. )
复制代码

[ 本帖最后由 hanyeguxing 于 2010-6-18 13:26 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

你好孤星,我运行了你给的批处理之后,TXT文件的标题可以成功改名,但是TXT文件内容的原第1、2行还在并没有删除?

TOP

批处理更改文本文件名为该文件的第一行内容
http://bbs.bathome.net/thread-287-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 zxzl 于 2010-6-18 12:47 发表
你好孤星,我运行了你给的批处理之后,TXT文件的标题可以成功改名,但是TXT文件内容的原第1、2行还在并没有删除?
忘记加输出了,已在2楼修改。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

忘记加输出了,已在2楼修改。


试了下修改过的,可是运行后把当前文件夹下的所有TXT文件都删除了

TOP

又试了一下还是不行,运行后还是全部删除,只生成一个$文件

TOP

我觉得用set/p=<和more+2会好一点
OrzDEF

TOP

原帖由 Seter 于 2010-6-18 16:48 发表
我觉得用set/p=


能否给个完整的代码呢?

TOP

我感觉在这两句前加个PAUSE就可以
ren $ "!a!.txt"
del /q /f "%%a"
我写代码的时候遇到这两个命令时要加pause暂停一下,然后才能修改成功。
努力学习,努力挣分

TOP

回复 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==
   )))>$
未测试。。。只是好像依稀记得遇到过此问题。
技术问题请到论坛发帖求助!

TOP

原帖由 随风 于 2010-6-18 21:33 发表
給2楼代码提点建议
1、ren 重命名文件最好不要用for直接遍历文件,会有bug
2、既然把setlocal enabledelayedexpansion放在for内部,说明考虑到文件内容和文件名特殊符号的问题,那么就不应该再是echo.%%b而是应该先 ...


不知随风版主能否给个完善点的代码?我对编程这方面不太懂,谢谢了

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4. for /f "tokens=1,* delims=:" %%a in ('findstr /n .* "%%a"') do (
  5.   if %%a equ 1 set name=%%b
  6.   if %%a geq 3 (echo.%%b >>!name!.txt)
  7. )
  8. del /q /f "%%a"
  9. )
  10. endlocal
  11. pause
复制代码
不知道是不是这样呢,我测试是可以的
努力学习,努力挣分

TOP

13楼同样未考虑到文件名及内容含!号的问题,并且如此使用findstr对效率是个大影响,如果文件数量过多的话。且未考虑到以冒号开头的行
8楼的思路
  1. @echo off
  2. for %%a in (*.txt) do (
  3.    set /p num=<"%%a"
  4.    set "wjm=%%~nxa"
  5.    setlocal enabledelayedexpansion
  6.    more +2 "!wjm!">tem
  7.    move tem "!num!.txt"
  8.    del /q "!wjm!"
  9.    endlocal
  10. )
  11. pause
复制代码

[ 本帖最后由 随风 于 2010-6-19 01:21 编辑 ]
技术问题请到论坛发帖求助!

TOP

为什么不直接
more +2 "!wjm!">"!num!.txt"
del /q "%%a"
可以不用临时文件吧。

还有一个问题使用>,但是假如有两个以上的文本第一行相同但内容可能不同(比如是一个完整的文章分成了几个文本)时该怎么办呢
努力学习,努力挣分

TOP

返回列表