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

[文本处理] 如何实现两文件间内容的部分有序替换

例如有一张CD的“红色慢摇.cue”文件是这样的:

REM DISCID AA0B990C      
REM COMMENT "ExactAudioCopy v0.99pb5"      
PERFORMER "百事高音乐"      
TITLE "刘紫玲.红色慢摇"      
FILE "红色慢摇.ape" WAVE      
  kkk01 AUDIO      
    TITLE "Track01"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 00:00:00      
  kkk02 AUDIO      
    TITLE "Track02"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 03:37:69      
  kkk03 AUDIO      
    TITLE "Track03"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 08:06:66      
  kkk04 AUDIO      
    TITLE "Track04"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 12:24:72      
  kkk05 AUDIO      
    TITLE "Track05"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 16:49:36      
  kkk06 AUDIO      
    TITLE "Track06"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 20:54:42      
  kkk07 AUDIO      
    TITLE "Track07"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 25:15:54      
  kkk08 AUDIO      
    TITLE "Track08"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 28:15:54      
  kkk09 AUDIO      
    TITLE "Track09"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 32:01:15      
  kkk10 AUDIO      
    TITLE "Track10"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 36:26:20      
  kkk11 AUDIO      
    TITLE "Track11"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 41:02:32      
  kkk12 AUDIO      
    TITLE "Track12"      
    PERFORMER "百事高音乐"      
    FLAGS DCP      
    INDEX 01 45:49:74      


我想把里面的Track01,Track02,。。。,Track12分别替换为“list.txt”文件的内容,内容如下:

01.南泥湾
02.红梅赞
03.十送红军
04.洪湖水浪打浪
05.泉水叮咚响
06.金梭和银梭
07.高楼万丈平地起
08.九九艳阳天
09.珊瑚颂
10.映山红
11.绣金匾
12.XXXXX

因为类似的文件很多,需批量修改,哪位大哥帮忙实现一下,谢谢!

[ 本帖最后由 sy78wpl 于 2010-12-27 01:54 编辑 ]

  1. @echo off&setlocal enableDelayedExpansion
  2. for /f "usebackq tokens=1* delims=." %%a in ("list.txt") do set #%%a=%%b
  3. (for /f "usebackq delims=" %%a in ("红色慢摇.cue") do (
  4.     set a=%%a
  5.     set a=!a: =!
  6.     if /i not "!a:~0,11!!a:~-1!"=="TITLE"Track"" (echo %%a) else for %%b in (!a:~-3^,2!) do echo     TITLE "%%b.!#%%b!"
  7. ))>han.ye
  8. del /q "红色慢摇.cue"
  9. ren "han.ye" "红色慢摇.cue"
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 hanyeguxing 于 2010-12-23 15:29 发表
@echo off&setlocal enableDelayedExpansion
for /f "usebackq tokens=1* delims=." %%a in ("list.txt") do set #%%a=%%b
(for /f "usebackq delims=" %%a in ("红色慢摇.cue") do (
    set a=%%a
    set a=! ...



您的解决很好,但是通常的cue文件不一定是“红色慢摇.cue”,可能是其他的 *.cue文件,能否让它更通用一点?

TOP

我自己修改了一下,为什么不行?
@echo off&setlocal enableDelayedExpansion
for /f "delims=" %%i in ('dir/b *.cue') do set title=%%i
for /f "usebackq tokens=1* delims=." %%a in ("list.txt") do set /a #%%a=%%b
(for /f "usebackq delims=" %%a in ("*.cue") do (
  set a=%%a
  set a=!a: =!
if /i not "!a:~0,11!!a:~-1!"=="TITLE"Track"" (echo %%a) else for %%b in (!a:~-3^,2!) do echo TITLE "%%

b.!#%%b!"
))>han.ye
del /q "*.cue"
ren "han.ye" "%title%"

TOP

  1. @echo off&setlocal enableDelayedExpansion
  2. for /f "usebackq tokens=1* delims=." %%a in ("list.txt") do set #%%a=%%b
  3. for %%f in (*.cue) do (
  4.     (for /f "usebackq delims=" %%a in ("%%f") do (
  5.         set a=%%a
  6.         set a=!a: =!
  7.         if /i not "!a:~0,11!!a:~-1!"=="TITLE"Track"" (
  8.             echo %%a
  9.         ) else (
  10.             for %%b in (!a:~-3^,2!) do echo     TITLE "%%b.!#%%b!"
  11.         )
  12.     ))>han.ye
  13.     move "han.ye" "%%f"
  14. )
复制代码

TOP

作为一个音乐发烧友会经常编辑CUE文件,我以前曾经写过一个,
因为一些cue采用UTF-8编码,会用到第三方命令行程序iconv转码.

代码如下:
  1. @echo off&setlocal enabledelayedexpansion&cls
  2. for /f "tokens=2" %%a in ('CHCP') do (if not "%%a"=="437" (mode con cols=80 lines=25&color 07&CHCP 437&graftabl 936))>nul
  3. path=%path%;g:\dos\command\第三方命令行程序
  4. ::=================重写CUE文件===================================
  5. set "artist=艺术家名" &set "album artist=专辑艺术家名" &set "album=专辑名"
  6. set "tracknumber=音轨号"&set "title=音轨标题"
  7. echo ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  8. echo ┃ ┃
  9. echo ┃   · 本程序用于CUE文件制作 ┃
  10. echo ┃   · 选项: ┃
  11. echo ┃     1 根据专辑描述文件^(xx.txt^)补充CUE缺少信息 ┃
  12. echo ┃        例如: ┃
  13. echo ┃     2 制作用于剪切APE的NEW_CUE ┃
  14. echo ┃        例如: ┃
  15. echo ┃ ┃
  16. echo ┃   ·q  退出 ┃
  17. echo ┃   ·c  清屏 ┃
  18. echo ┃ ┃
  19. echo ┃   ·                       hf-g 2009-08-06 [彭城] ┃
  20. echo ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  21. if not "%~1"=="" (
  22. set "workPath=%~dp1"
  23. ) else (
  24. set /p"workPath=输入工作目录:"
  25. if not defined workPath set "workPath=%~dp0"
  26. )
  27. pushd "%workPath%"||echo 目录中含有特殊字符 ^^^^ ^^!
  28. if "%workPath:~-1%"=="\" set "workPath=!workPath:~,-1!"
  29. for /f "tokens=*" %%a in ("!workPath!") do set "pathname=%%~na"
  30. ::查找最相似的专辑描述文件(xx.txt) ①同名-②含有-③同文件夹名-④含有文件夹名-⑤唯一.txt
  31. if not "%~1"=="" (
  32. if EXIST "%~n1.txt" (set "sour_txt=%~n1.txt"&goto jmp1)
  33. for /f "tokens=* delims=" %%a in ('dir /a-d /b "*%~n1*.txt" 2^>nul') do (
  34. set "sour_txt=%%~a"
  35. if not "!sour_txt!"=="" goto jmp1)
  36. )
  37. ::③同文件夹名-④含有文件夹名
  38. if EXIST "%pathname%.txt" (set "sour_txt=%pathname%.txt"&goto jmp1)
  39. for /f "tokens=* delims=" %%a in ('dir /a-d /b "*!pathname!*.txt" 2^>nul') do (
  40. set "sour_txt=%%~a"
  41. if not "!sour_txt!"=="" goto jmp1)
  42. ::⑤唯一.txt
  43. for /f "tokens=* delims=" %%a in ('dir /a-d /b *.txt^|find /c "txt$"') do (
  44. set n=%%a
  45. if !n!==1 for /f "tokens=* delims=" %%a in ('dir /a-d /b *.txt 2^>nul') do "sour_txt=%%~a")
  46. :jmp1
  47. ::确定CUE文件(xx.cue)
  48. if not "%~1"=="" (set "sour_CUE=%~nx1"&goto jmp2)
  49. if EXIST "%pathname%.cue" (set "sour_CUE=%pathname%.cue") else (for /f "tokens=*" %%a in ('dir /a-d /b "*!pathname!*.cue"') do set "sour_CUE=%%a")
  50. :jmp2
  51. if "!sour_txt!"=="" (set /p "sour_txt=专辑描述文件:")
  52. if "!sour_CUE!"=="" (set /p "sour_CUE=源CUE文件:")
  53. echo 工作目录: %workPath%&echo 专辑描述文件: !sour_txt!&echo 源CUE文件: !sour_CUE!&if EXIST "1.txt" echo 1.txt
  54. ::==============================================================
  55. set "desFile=New_%sour_CUE%"
  56. set /p "chiose=补充CUE|剪切APE的NEW_CUE(1|2|q):"
  57. if "%chiose%"=="1" (
  58. if EXIST "1.txt" set "sour_txt=1.txt"&echo 存在1.txt文件!
  59. set /p "xxoo=sour_txt文件来源方式(APE原始说明.txt|从foorb2000粘贴建立)(1|2):"
  60. echo !xxoo!|findstr "^[12]$">nul&&goto :format_!xxoo!||(echo ERROR&ping /n 4 127.1>nul)
  61. )
  62. if "%chiose%"=="2" set /p "xxoo=音轨号 时间(0x~xx mm:ss mm:ss):"
  63. if "%chiose%"=="2" goto :CUT_time
  64. goto:eof
  65. ::==============================================================
  66. :format_1   格式如: 01.烟花三月
  67. echo 格式1
  68. for /f "tokens=1* delims=.[#] " %%a in ('type "%sour_txt%"^|findstr "^[0-9] ^[0-9][0-9]"') do (
  69. if 1%%a LEQ 19 (
  70. for /f "tokens=*" %%A in ("%%b") do if not "%%A"=="" (set title_0%%a=%%~A) else set "title_0%%a="
  71. echo %tracknumber%0%%a: !artist_%%a!+!album_%%a!+!title_0%%a!+
  72. ) else (
  73. for /f "tokens=*" %%A in ("%%b") do if not "%%A"=="" (set title_%%a=%%~A) else set "title_%%a="
  74. echo %tracknumber%%%a: !artist_%%a!+!album_%%a!+!title_%%a!+
  75. )
  76. )
  77. echo off&pause
  78. goto :work
  79. ::==============================================================
  80. :format_2    格式如: 02. 张琼 - [? #02] 望月
  81. ::=================sour_txt=从foorb2000 粘贴建立的音轨信息文件==================
  82. echo 格式2
  83. echo off
  84. for /f "tokens=2,3,4,5 usebackq delims=.[#]" %%a in ("%sour_txt%") do (
  85. for /f "tokens=*" %%A in ("%%a") do if not "%%A"=="" (set artist_%%c=%%~nA &set artist_%%c=!artist_%%c:~0,-3!) else set "artist_%%c="
  86. for /f "tokens=*" %%B in ("%%b") do if not "%%B"=="?" (set album_%%c=%%~nB &set album_%%c=!album_%%c:~0,-2!) else set "album_%%c="
  87. set "tracknumber_%%c=%%c"
  88. for /f "tokens=*" %%D in ("%%d") do if not "%%D"=="?" (set title_%%c=%%~nD &set title_%%c=!title_%%c:~0,-1!) else set "title_%%c="
  89. echo %tracknumber%%%c: !artist_%%c!+!album_%%c!+!title_%%c!+
  90. )
  91. goto :work
  92. ::==============================================================
  93. :CUT_time xxoo=音轨号 时间(0x~xx mm:ss)
  94. echo 剪切计算
  95. for /f "tokens=1,2,3 delims= " %%a in ("%xxoo%") do set "tracknumber=%%a"&set "start_time=%%b"&set "end_time=%%c"
  96. echo %start_time% %end_time% %tracknumber%
  97. set "BL_writeCUE=1"&set "BL_search=0"
  98. for /f "tokens=* usebackq" %%a in ("%sour_CUE%") do (
  99. if /i "%%a"=="TRACK 01 AUDIO" set "BL_writeCUE=0"
  100. if /i "%%a"=="TRACK %tracknumber% AUDIO" set "BL_search=1"
  101. if "!BL_search!"=="1" (
  102. for /f "tokens=*" %%i in ('echo %%a^|findstr /i "INDEX 01"') do (
  103. for /f "tokens=3 delims= " %%A in ("%%i") do set "first_time=%%A"
  104. echo %%i 音轨%tracknumber%初始时间 = !first_time!&goto cut_next
  105. ))
  106. if "!BL_writeCUE!"=="1" echo %%a>>"%desFile%"
  107. )
  108. :cut_next
  109. set "mm1=%first_time:~0,2%"&set "ss1=%first_time:~3,2%"
  110. set "mm2=%start_time:~0,2%"&set "ss2=%start_time:~3,2%"
  111. set "mm3=%end_time:~0,2%"&set "ss3=%end_time:~3,2%"
  112. set "mm3=00%mm3%"&set "mm3=!mm3:~-2!
  113. set "mm2=00%mm2%"&set "mm2=!mm2:~-2!
  114. set /a mm1=1%mm1% "%%" 100,ss1=1%ss1% "%%" 100
  115. set /a mm2=1%mm2% "%%" 100,ss2=1%ss2% "%%" 100
  116. set /a mm3=1%mm3% "%%" 100,ss3=1%ss3% "%%" 100
  117. set /a s1=%ss2%+%ss1%&set /a s2=%ss3%+%ss1%
  118. if !s2! GTR 60 set /a "s2=!s2!-60"&set /a mm3=!mm3!+1
  119. if !s1! GTR 60 set /a "s1=!s1!-60"&set /a mm2=!mm2!+1
  120. echo %mm2%:%ss2%  %mm3%:%ss3%  !mm2!:!ss2!  !mm3!:!ss3!  !s1! !s2!
  121. set /a m1=!mm1!+!mm2!&set /a m2=!mm1!+!mm3!
  122. set "m1=00!m1!"&set "m1=!m1:~-2!
  123. set "m2=00!m2!"&set "m2=!m2:~-2!
  124. set "s1=00%s1%"&set "s1=!s1:~-2!
  125. set "s2=00%s2%"&set "s2=!s2:~-2!
  126. (echo TRACK 01 AUDIO
  127. echo INDEX 01 !m1!:%s1%:%first_time:~-2%
  128. echo TRACK 02 AUDIO
  129. echo INDEX 01 !m2!:%s2%:%first_time:~-2%)>>"%desFile%"
  130. goto :end
  131. ::==============================================================
  132. :work UTF-8 编码需要转换成ASNI
  133. call:is_UTF-8 "%sour_CUE%"
  134. if %ret% EQU 1 (
  135. echo UTF-8 文件
  136. iconv -c -f utf-8 -t GB2312 "%sour_CUE%">"%temp%\%sour_CUE%"
  137. set "sour_CUE=%temp%\%sour_CUE%")
  138. echo.
  139. cd.>"%desFile%"
  140. set /a NUM=101&set "BL_writeCUE=1"
  141. for /f "tokens=*" %%a in ('type "%sour_CUE%"') do (
  142. if /i "%%a"=="TRACK 01 AUDIO" set "BL_writeCUE=0"
  143. if "!BL_writeCUE!"=="1" (
  144. echo %%a>>"%desFile%"
  145. ) else (
  146. echo %%a|findstr /i "^FILE">nul &&echo %%a>>"%desFile%"
  147. echo %%a|findstr /i "^PERFORMER ^TRACK">nul &&echo   %%a>>"%desFile%"
  148. echo %%a|findstr /i "^INDEX">nul &&echo     %%a>>"%desFile%"
  149. )
  150. if /i "%%a"=="TRACK !NUM:~-2! AUDIO" (
  151. for %%A in (!NUM:~-2!) do (
  152. if not "!title_%%A!"=="" set /p =正在写入:!title_%%A! <NUL&echo     TITLE "!title_%%A!">>"%desFile%"
  153. if not "!artist_%%A!"=="" echo PERFORMER "!artist_%%A!">>"%desFile%"
  154. set /a NUM+=1
  155. )))
  156. goto end
  157. ::==============================================================
  158. :end
  159. echo.
  160. echo 按任意键退出&pause>nul
  161. exit /b
  162. ::=======================判断文件UTF-8编码==============================
  163. :is_UTF-8 filename 返回值 ret=1 true ret=0 flash
  164. echo exit|%ComSpec% /k prompt f0 f 0$_n%~s1$_l0$_d0 f$_q$_|debug>"%temp%\%~n1.tmp"
  165. type "%temp%\%~n1.tmp"|findstr /c:"  EF BB BF">nul&&set ret=1||set ret=0
  166. del "%temp%\%~n1.tmp" 2>nul
  167. goto :eof
  168. ::=======================END CODE===============================
复制代码

TOP

回复 2楼 5楼 的帖子

基本上可以实现,但对任意的txt文件,或者英文歌曲时(英文歌曲单词与单词间是空格)仍修改错误。

TOP

返回列表