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

[文本处理] 批处理歌词整理挑战

  1. [00:00.010]铁血丹心 射雕英雄传主题曲 - 罗文/甄妮
  2. [00:00.020]词:邓伟雄
  3. [00:00.030]曲:顾嘉辉
  4. [00:28.988]女:依稀往梦似曾见
  5. [00:34.168]心内波澜现
  6. [00:39.808]男:抛开世事断仇怨
  7. [00:45.142]合:相伴 到天 边
  8. [00:49.350]男:逐草四方沙漠苍茫
  9. [00:55.452]那惧雪霜扑面
  10. [01:00.275]射雕引弓塞外奔驰
  11. [01:06.210]笑傲此生无厌倦
  12. [01:12.358]女:应知爱意似流水
  13. [01:18.050]斩不断理还乱
  14. [01:23.231]合:身经百劫也在心间恩义两难断
  15. [01:43.865]男:逐草四方沙漠苍茫
  16. [01:49.962]那惧雪霜扑面
  17. [01:54.739]射雕引弓塞外奔驰
  18. [02:00.779]笑傲此生无厌倦
  19. [02:06.930]女:应知爱意似流水
  20. [02:12.510]斩不断理还乱
  21. [02:17.836]合:身经百劫也在心间
  22. [02:23.271]恩义两难断
  23. [02:28.661]身经百劫也在心间
  24. [02:34.151]恩义两难断
复制代码
整理后
  1. [00:00.010]铁血丹心 射雕英雄传主题曲 - 罗文/甄妮
  2. [00:00.020]词:邓伟雄
  3. [00:00.030]曲:顾嘉辉
  4. [00:28.988]女:依稀往梦似曾见
  5. [00:34.168]心内波澜现
  6. [00:39.808]男:抛开世事断仇怨
  7. [00:45.142]合:相伴 到天 边
  8. [00:49.350][01:43.865]男:逐草四方沙漠苍茫
  9. [00:55.452][01:49.962]那惧雪霜扑面
  10. [01:00.275][01:54.739]射雕引弓塞外奔驰
  11. [01:06.210][02:00.779]笑傲此生无厌倦
  12. [01:12.358][02:06.930]女:应知爱意似流水
  13. [01:18.050][02:12.510]斩不断理还乱
  14. [01:23.231][02:17.836][02:28.661]合:身经百劫也在心间恩义两难断
复制代码

回复 1# smss
楼主,再仔细看了你的题和结果,理解的合并规则是和你的结果的确不同。如果要达到你那样的结果,后面的代码需要可以为之。
试同贴道友的代码,也不能等于你的结果。
如果方便,麻烦你贴出你的代码,琢磨以下。

本人已老,学习bat已很不利索。其他语言困难重重。
目的,学习批处理

TOP

  1. //歌词合并精简.js//拖入歌词文件
  2. lrcfile = WScript.Arguments(0);
  3. Rstream = new ActiveXObject("ADODB.Stream");
  4. Rstream.Type=2; //类型1是二进制,2是文本
  5. Rstream.Charset = "GBK";
  6. Rstream.Open;
  7. Rstream.LoadFromFile(lrcfile); //读歌词文件
  8. var i=n=tflag=sflag=lflag=0;
  9. var btime=[],lyric=[],tmpTime=rchr='';
  10. while(!Rstream.EOS){
  11. Rchar=Rstream.ReadText(1);
  12. rchr+=Rchar;
  13. if(tflag && Rchar==']'){ //时间末,词始
  14. tmpTime+=rchr;rchr='';tflag=0,sflag=1;
  15. }else if(sflag && Rchar=='\n'){ //词末
  16. tmpLrc=rchr;sflag=lflag=0;
  17. for(i=1;i<=n;i++){ //检查重复词
  18. if(lyric[i]==tmpLrc){lflag=1;break;}
  19. }
  20. if(lflag){btime[i]+=tmpTime;} //合并时间
  21. else{n++;lyric[n]=tmpLrc;btime[n]=tmpTime;}
  22. rchr=tmpTime='';
  23. }else if(Rchar=='[')tflag=1; //时间始
  24. }
  25. Rstream.Close;
  26. joinLrc='歌词文件:'+lrcfile+'\n\n';
  27. for(i=1;i<=n;i++){
  28. joinLrc+=btime[i]+lyric[i];
  29. }
  30. WSH.Echo(joinLrc); //显示精简后歌词
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

回复 3# hlzj88

换个语言就 easy 了!
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

  1. @echo off&&setlocal enabledelayedexpansion
  2. rem 保护原文copy /y b.txt a.txt>nul
  3. set /p gc=-----输入歌词文本名----》
  4. :ks
  5.   for /f "delims=" %%i in ('type %gc%') do (
  6.       set ww=
  7.       set sj=
  8.       set bb=
  9.       set aa=
  10.       set "aa=%%i"
  11.        set bb=!aa:~11!
  12.        set aa=!aa:~0,11!
  13.        set aa=!aa:^:=!
  14.        set aa=!aa:^.=!
  15.        findstr /ic:"!bb!" %gc%>>!aa!.ini
  16.        findstr /ivc:"!bb!" %gc%>>test.ini
  17.     for /f "delims=*" %%j in ('type !aa!.ini') do (
  18.        set "sj=%%j"
  19.        set ww=!ww!!sj:~0,11!
  20.        )
  21.     echo !ww!!bb!>>55555.txt
  22.        move test.ini %gc%>nul
  23.        goto ks
  24.       )
  25. move /y 55555.txt %gc%>nul
  26. del /q *.ini>nul
  27. pause
复制代码
只能做到样子特别像,没有达到楼主的一模一样。所以怀疑楼主出题有误。
目的,学习批处理

TOP

本帖最后由 qixiaobin0715 于 2022-5-28 09:38 编辑

提供一个思路,但未完全达到楼主要求(“身经百劫也在心间” “恩义两难断”两句未合并):
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=]" %%i in (test.lrc) do set _%%j=!_%%j!%%i]
  4. for /f "tokens=1* delims=_=" %%a in ('set _') do set #%%b=%%a
  5. for /f "tokens=1* delims=#=" %%x in ('set #') do echo,%%x%%y
  6. pause
复制代码
1

评分人数

TOP

返回列表