Board logo

标题: [文件操作] 批处理如何提取txt文本里第一行中的小说名来重命名该文本文件? [打印本页]

作者: jellyhk    时间: 2011-12-12 11:32     标题: 批处理如何提取txt文本里第一行中的小说名来重命名该文本文件?

如何从 txt 的第一行提取书名,并以此为名重命名该 txt?
1《宦海龙腾》全集声明:本书由奇书网(www.Qisuu.……
2《以鼠之名》全集
作者: jellyhk    时间: 2011-12-12 12:33

代码已经修改!
  1. setlocal EnableDelayedExpansion
  2. if not exist 小说提取目录 md 小说提取目录
  3. :l
  4. set n=0
  5. for /f %%a in ('dir /b 2*.txt') do (  
  6.    for /f "delims=全集 tokens=1" %%b in (%%a) do (
  7.    set /a n+=1
  8.    if !n! == 1 (move %%a 小说提取目录\%%b.txt) else (
  9.     if !n! == 2 goto l
  10. )
  11. )     
  12. )
  13. for /f %%a in ('dir /b 2*.txt') do type %%a >$&move $ %%a&goto l
  14. pause
复制代码
命名是成功的!不过我有个疑问!我看运行记录为什么会读取到作者?
>>>>>>2:
运行到最后没有文件了会显示找不到文件!怎么改下
作者: slore    时间: 2011-12-12 13:11

你的问题是n没有被初始化。。。第2个文本进循环后n不是0开始的,所以不输出。

delims不支持 单词 分割。。。

for这种循环会一直循环到文件结束,你只用第一行,这种方式太浪费了。
  1. if not exist out_dir  md out_dir
  2. for /f %%a in ('dir /b 2*.txt') do (
  3.     CALL :SUB_REN %%a
  4. )
  5. pause
  6. exit
  7. :SUB_REN
  8. for /f "delims=《》 tokens=2" %%b in (%1) do (
  9.    move %1 out_dir\%%b.txt
  10.    goto :EOF
  11. )
复制代码
大概写成代码可能能好的。

如果非要2楼的代码能处理第2个文本,请加上

for /f %%a in ('dir /b 2*.txt') do (
   set /a n=0
   for /f "delims=全集 tokens=1" %%b in (%%a) do (
作者: CrLf    时间: 2011-12-12 16:16

楼主也是铁杆坛友了,以你的经验,这样的标题和顶楼内容能过关吗...
作者: jellyhk    时间: 2011-12-13 10:24

本帖最后由 jellyhk 于 2011-12-13 10:26 编辑

回复 4# CrLf
呵呵!我的错!我从小语文就很烂!真想不出对的标题!抱歉了
作者: jellyhk    时间: 2011-12-13 10:31

本帖最后由 jellyhk 于 2011-12-13 11:01 编辑
delims不支持 单词 分割。 ...
slore 发表于 2011-12-12 13:11

2楼有新问题!·!帮忙看看

    不支持 单词 分割?就是说这里不能用中文?还是词语?但是怎么能成功呢?
另外你的goto :eof是不是实现了防止阅读完小说的功能呢?
goto :eof是跳到call下面吗?那不是命名一个文件后就到pause那段代码了?
作者: CrLf    时间: 2011-12-13 11:28

本帖最后由 CrLf 于 2011-12-13 11:43 编辑
  1. @echo off
  2. for /f "tokens=2*delims=:" %%a in ('findstr /n . 2*.txt^|findstr /b 1:') do (
  3.    for /f "tokens=2delims=《》" %%c in ("@%%b") do ren "%%a" "%%c"
  4. )
复制代码

作者: slore    时间: 2011-12-13 11:39

本帖最后由 slore 于 2011-12-13 11:44 编辑

回复 6# jellyhk


    不支持词语,中文支持。
  1. @echo off
  2. for /f "delims=全集 tokens=1" %%i in (t.txt) do (
  3.     echo %%i
  4. )
  5. pause
  6. for /f "delims=「」 tokens=1" %%i in (t.txt) do (
  7.     echo %%i
  8. )
  9. pause
复制代码
测试文本内容
「haha」全集
「abc集123」全集
「123全456」全集
「test」全集


输出结果为
  1. 「ha ha」
  2. 「abc
  3. 「123
  4. 「te st」
  5. ha ha
  6. abc集1 23
  7. 123全456
  8. te st
复制代码
goto 不一样 和 call 标签不一样

为什么会看到作者,因为会读第2行,干嘛加那个=2的判断?直接goto l    ,n也不用算。。。肯定是第一行,进来就处理,然后就goto就行了。
你这个正好move移走文件了,不然就是循环了。。。
你这个dir的次数多。。。用标签把循环拆开的话,dir只用一次。

EOF是文件结尾,其实就是结束下面的 循环,因为是call调用,所以会到for里面,继续第2个文件。
作者: jellyhk    时间: 2011-12-13 11:52

回复 7# CrLf
完全没反映!
作者: jellyhk    时间: 2011-12-13 12:00

回复 8# slore
是哈只处理第一行不用自加!
goto :eof是跳到call下面?又因为call再for里所以运行第2个文件?对吗?
作者: slore    时间: 2011-12-13 12:24

回复 10# jellyhk


作者: HAT    时间: 2011-12-13 12:41

回复 10# jellyhk


goto :eof是跳转到文件结尾
具体到你这个例子中,它的作用是介绍本次call调用。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2