Board logo

标题: [文本处理] [已解决]批处理提取第一行为文本标题的扩展 [打印本页]

作者: 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 编辑
  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. )
复制代码
请教添加在哪儿?
我一个文件夹里有 500个 内容第一行为 title1 的文本,500个内容第一行为title2的文本。 甚至上万个。
作者: cjiabing    时间: 2011-7-20 22:21

你哪里来的代码?自己写的?
还有删掉第一行?也就是用作标题的那一行?
不懂得你是不是要这样
  1. @echo off
  2. set nb=0
  3. for %%a in (*.txt) do (
  4.    setlocal enabledelayedexpansion
  5.    (for /F "usebackq delims=" %%b in ("%%a") do (
  6.       if defined b (echo.%%b) else (set /a nb+=1
  7.           set "a=!nb!_%%b")
  8.       set b==
  9.    ))>$
  10.    ren $ "!a!.txt"
  11.    del /q /f "%%a"
  12.    Endlocal
  13. )
复制代码

作者: CrLf    时间: 2011-7-20 23:53

本帖最后由 CrLf 于 2011-7-23 20:08 编辑

提高兼容性和准确率:
  1. @echo off>nul 2>nul 3>nul 4>nul
  2. for /l %%a in (1 1 8) do (for /l %%b in (1 1 7) do echo asfdf:%random%)>%%a.txt
  3. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  4.    set a=
  5.    (for /f "useback delims=" %%b in ("%%a") do (
  6.       if defined a (echo;%%b) else (
  7.          for /f delims^=\/:*?^<^>^|^" %%c in ("%%b") do set "a=%%c"
  8.          if not defined a echo;%%b
  9.       )
  10.    ))>$
  11.    if not defined a set "a=%%~na"
  12.    rem 获取文件名和输出文本
  13.    set $=!a!#
  14.    set len=0
  15.    for %%a in (32 16 8 4 2 1) do (
  16.       if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  17.    )
  18.    rem 计算文件名长度
  19.    set n=
  20.    setlocal enabledelayedexpansion
  21.    for %%b in (!len!) do (
  22.       for %%c in ("!a!*.tx$") do (
  23.          for /f %%d in ("!n!") do endlocal&set n=%%~d
  24.          set test=%%~nc
  25.          setlocal enabledelayedexpansion
  26.          rem 转换变量
  27.          for /f "tokens=1-3 delims=0123456789" %%d in (
  28.             "!test:~%%b!\"
  29.          ) do (
  30.             if %%f neq \ set /a n-=1
  31.          )
  32.          rem 排除文件名干扰
  33.       )
  34.    )
  35.    move $ "!a!!n!.tx$"
  36.    Endlocal
  37. )
  38. del /f /a *.txt
  39. ren *.tx$ *.txt
  40. rem 取代原有的txt
  41. 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

写这么长是为了尽可能提高兼容性:
  1. @echo off>nul 2>nul 3>nul 4>nul
  2. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  3.    set a=
  4.    (for /f "useback delims=" %%b in ("%%a") do (
  5.       if defined a (echo;%%b) else (
  6.          set a=%%b
  7.          setlocal enabledelayedexpansion
  8.          set a=!a:?=-!
  9.          for %%c in (\ / : ^< ^> ^| ^") do if defined a set a=!a:%%c=-!
  10.          for /f "tokens=1* delims=*" %%c in ("!a!") do (
  11.             for /f "delims=" %%e in ("!a!") do (
  12.                endlocal&set a=%%e
  13.                if "%%d" neq "" (
  14.                   setlocal enabledelayedexpansion
  15.                   for /l %%a in (0 1 63) do (
  16.                      if "!a:~%%a,1!"=="*" (
  17.                         set "m=!m!-"
  18.                      ) else set "m=!m!!a:~%%a,1!"
  19.                   )
  20.                ) else setlocal enabledelayedexpansion
  21.             )
  22.          )
  23.          for /f "delims=" %%c in ("!a!") do endlocal&set a=%%c
  24.          rem 替换特殊字符为-
  25.          if not defined a echo;%%b
  26.       )
  27.    ))>$
  28.    if not defined a set "a=%%~na"
  29.    rem 获取文件名和输出文本
  30.    set $=!a!#
  31.    set len=0
  32.    for %%a in (32 16 8 4 2 1) do (
  33.       if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  34.    )
  35.    rem 计算文件名长度
  36.    set n=
  37.    setlocal enabledelayedexpansion
  38.    for %%b in (!len!) do (
  39.       for %%c in ("!a!*.tx$") do (
  40.          for /f %%d in ("!n!") do endlocal&set n=%%~d
  41.          set test=%%~nc
  42.          setlocal enabledelayedexpansion
  43.          rem 转换变量
  44.          for /f "tokens=1-3 delims=0123456789" %%d in (
  45.             "!test:~%%b!\"
  46.          ) do (
  47.             if %%f neq \ set /a n-=1
  48.          )
  49.          rem 排除文件名干扰
  50.       )
  51.    )
  52.    move $ "!a!!n!.tx$"
  53.    endlocal
  54. )
  55. del /f /a *.txt
  56. ren *.tx$ *.txt
  57. :: 取代原有的txt
  58. pause>con
复制代码
总结:批处理中的 * 和 ! 真蛋疼




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