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

[文本处理] 【已解决】批处理如何获取文本里特定行中的指定内容并按指定规则进行字符替换

本帖最后由 pcl_test 于 2016-9-3 12:16 编辑

[文本处理]批处理如何批量切分指定的字符串

一、材料,如:
老封推箱子box文件:


[Level 1]
MapWidth=8
MapHeight=8
MapData=0011111011122210124212111212232112222121112122210162211101111100
Title=Minicosmos 01
Author=Aymeric du Peloux

[Level 2]
MapWidth=8
MapHeight=9
MapData=000011111111122112224221122312211121121112222221126122211221111111110000
Title=Minicosmos 04
Author=Aymeric du Peloux

……

二、生成下列“YSokoban”xsb 格式:
  1.   #####
  2. ###   #
  3. # $ # ##
  4. # #  . #
  5. #    # #
  6. ## #   #
  7. #@  ###
  8. #####  
  9. ; Level 1
  10.     ####
  11. #####  #
  12. #   $  #
  13. #  .#  #
  14. ## ## ##
  15. #      #
  16. # @#   #
  17. #  #####
  18. ####   
  19. ; Level 2
复制代码
三、老封推箱数字与符号的关系

0        场外空白
1        #        墙壁
2        空隔        空地 / 过道
3        .        仓位
4        $        箱子
5        *         箱子 + 仓位
6        @         推箱人
7        +         推箱人 + 仓位

四、我的代码
  1. @echo off
  2. set a=
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in (1.txt)do (
  5. set new=%%a
  6. :ne
  7. set/a a+=1,w=%a%*8
  8. echo,!new:~%w%,8!>>1.txt
  9. if !a! lss 9 goto:ne
  10. )
  11. call:box2xsb 1.txt 1.xsb
  12. pause
  13. goto:eof
  14. :box2xsb
  15. for %%a in (%1)do (
  16. for /f "delims=" %%i in (%%a)do (
  17. set var=%%i
  18. set var=!var:0=^ !
  19. set var=!var:1=^#!
  20. set var=!var:2=^ !
  21. set var=!var:3=^.!
  22. set var=!var:4=^$!
  23. set var=!var:5=^*!
  24. set var=!var:6=^@!
  25. set var=!var:7=^+!
  26. echo !var!
  27. )>>%2
  28. )
  29. goto:eof
复制代码
五、求助

批量处理将上述box材料转成xsb格式……

在我的上段代码中不能自动获取宽与高的数字,要手工写。更不能批量处理,写了一天都没有成功。底子太差,只好求助高手指点,谢谢了!
1

评分人数

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

本帖最后由 pcl_test 于 2016-9-3 07:02 编辑

举个栗子
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('findstr "^MapWidth= ^MapData=" "%~f0"') do set "%%a"
  3. set n=-1
  4. for %%a in (" ",#," ",.,$,@,@,+) do set /a n+=1&set "#!n!=%%~a"
  5. set #5=*
  6. :loop
  7. set str=!MapData:~%t%,%MapWidth%!
  8. set /a t+=MapWidth
  9. for /l %%a in (0,1,%MapWidth%) do (
  10.     for /f %%b in ("!str:~%%a,1!") do set "s=!s!!#%%b!"
  11. )
  12. echo;%s% %str%
  13. set s=
  14. if "%str%" neq "" goto loop
  15. pause&exit
  16. [Level 1]
  17. MapWidth=8
  18. MapHeight=8
  19. MapData=0011111011122210124212111212232112222121112122210162211101111100
  20. Title=Minicosmos 01
  21. Author=Aymeric du Peloux
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('findstr "^MapWidth= ^MapData=" "%~f0"') do set "%%a"
  3. set MapData=%MapData:0= %
  4. set MapData=%MapData:1=#%
  5. set MapData=%MapData:2= %
  6. set MapData=%MapData:3=.%
  7. set MapData=%MapData:4=$%
  8. set MapData=%MapData:5=*%
  9. set MapData=%MapData:6=@%
  10. set MapData=%MapData:7=+%
  11. :loop
  12. set str=!MapData:~%t%,%MapWidth%!
  13. set /a t+=MapWidth
  14. echo;%str%
  15. if "%str%" neq "" goto loop
  16. pause&exit
  17. [Level 2]
  18. MapWidth=8
  19. MapHeight=9
  20. MapData=000011111111122112224221122312211121121112222221126122211221111111110000
  21. Title=Minicosmos 04
  22. Author=Aymeric du Peloux
复制代码
1

评分人数

    • pan528: 太巧妙了!精彩!技术 + 1

TOP

本帖最后由 pcl_test 于 2016-9-3 07:14 编辑

第三方http://www.bathome.net/s/tool/index.html?key=gawk
  1. #*&cls&gawk -f "%~f0" "box文件.txt">con&pause&exit
  2. BEGIN{split(" ,#, ,.,$,*,@,+",reg,",")}
  3. {
  4.     gsub(/^[[:space:]]*|[[:space:]]*$/,"",$0);
  5.     if($0~/^\[Level [0-9]+\]/)level=substr($0,2,length($0)-2);
  6.     if($0~/^MapWidth=[1-9][0-9]*/)split($0,width,"=");
  7.     if($0~/^MapData=[0-7]+/)split($0,data,"=");
  8.     if(width[2]&&data[2]){
  9.         n=1;
  10.         while((str=substr(data[2],n,width[2]))!=""){
  11.             s="";
  12.             for(i=1;i<=length(str);i++){
  13.                 s=s""reg[substr(str,i,1)+1];
  14.             }
  15.             n+=width[2];
  16.             print s,str;
  17.         }
  18.         print "; "level"\n"
  19.         delete width;
  20.         delete data;
  21.     }
  22. }
复制代码
  1. #*&cls&gawk -f "%~f0" "box文件.txt">con&pause&exit
  2. BEGIN{split(" ,#, ,.,$,*,@,+",reg,",")}
  3. {
  4.     gsub(/^[[:space:]]*|[[:space:]]*$/,"",$0);
  5.     if($0~/^\[Level [0-9]+\]/)level=substr($0,2,length($0)-2);
  6.     if($0~/^MapWidth=[1-9][0-9]*/)split($0,width,"=");
  7.     if($0~/^MapData=[0-7]+/)split($0,data,"=");
  8.     if(width[2]&&data[2]){
  9.         for(i=0;i<=7;i++)gsub(i,reg[i+1],data[2]);
  10.         n=1;
  11.         while((str=substr(data[2],n,width[2]))!=""){
  12.             n+=width[2];
  13.             print str;
  14.         }
  15.         print "; "level"\n"
  16.         delete width;
  17.         delete data;
  18.     }
  19. }
复制代码
1

评分人数

    • pan528: 第三方软件,效力挺高,精湛!技术 + 1

TOP

本帖最后由 codegay 于 2016-9-3 07:20 编辑

这种格式就是INI 配置文件啦
inifile.exe 命令的用法:
  1. C:\bcn>inifile batbox.ini [Level 1]
  2. set MapWidth=8
  3. set MapHeight=8
  4. set MapData=0011111011122210124212111212232112222121112122210162211101111100
  5. set Title=Minicosmos 01
  6. set Author=Aymeric du Peloux
复制代码
  1. C:\bcn>inifile batbox.ini [Level 1] mapheight
  2. set mapheight=8
复制代码
  1. C:\bcn>inifile batbox.ini [Level 2] mapheight
  2. set mapheight=9
复制代码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 2# pcl_test
非常感谢!已全部通过测试。代码简洁,思路巧妙!我要慢慢消化。
先用你的原码做了一个直接转化命令:
  1. @echo off
  2. echo 1、按关卡切割文本,请稍候 ...
  3. if exist ~n rd /q /s ~n
  4. if not exist ~n md ~n
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%i in (%~nx1)do (
  7. set m=%%i
  8. if "!m:~0,6!" == "[Level" set x=000!m:~7,-1!& echo %%i>~n\!x:~-4!.txt
  9.         if not "!m:~0,6!" == "[Level" echo %%i>>~n\!x:~-4!.txt
  10. )
  11. if exist ~n\~-4.txt del ~n\~-4.txt
  12. echo 2、将 box 格式转为 xsb 格式,请稍候 ...
  13. for /f "delims=" %%i in ('dir /b /o ~n\*.txt')do (
  14. set /a a+=1
  15. call:box2xsb ~n\%%i
  16. echo ; Level !a!
  17. echo.
  18. )>>%~n1.xsb
  19. endlocal
  20. pause
  21. goto:eof
  22. :box2xsb
  23. setlocal enabledelayedexpansion
  24. for /f "delims=" %%a in ('findstr "^MapWidth= ^MapData=" "%1"') do set "%%a"
  25. set MapData=%MapData:0= %
  26. set MapData=%MapData:1=#%
  27. set MapData=%MapData:2= %
  28. set MapData=%MapData:3=.%
  29. set MapData=%MapData:4=$%
  30. set MapData=%MapData:5=*%
  31. set MapData=%MapData:6=@%
  32. set MapData=%MapData:7=+%
  33. :loop
  34. set str=!MapData:~%t%,%MapWidth%!
  35. set /a t+=MapWidth
  36. echo;%str%
  37. if "%str%" neq "" goto loop
  38. goto:eof
复制代码

TOP

回复 3# pcl_test

非党感谢,一下子给了四个方案。这两个第三方软件,效力高多了,转换几乎是在瞬间完成!

再次感谢版主的指教!

TOP

回复 4# codegay

感谢回贴!但inifile.exe 命令的用法,不明白,因此没有测试。但还是要谢谢你的热心!

TOP

本帖最后由 codegay 于 2016-9-3 12:30 编辑
  1. """
  2. 老封推箱数据格式转YSokoban(xsb)
  3. 2016年9月3日 12:01:30 codegay
  4. """
  5. import configparser
  6. punctuation = " # .$*@+"
  7. boxini = configparser.ConfigParser()
  8. boxini.read("batbox.ini")
  9. 节点= boxini.sections()
  10. print(节点)
  11. #=>['Level 1', 'Level 2']
  12. for r in 节点:
  13.     width=int(boxini.get(r,"MapWidth"))
  14.     height=int(boxini.get(r,"MapHeight"))
  15.     data=boxini.get(r,"MapData")
  16.    
  17.     result=''.join([punctuation[int(d)] if (e%width!=0) else (punctuation[int(d)]+"\n") for e,d in enumerate(data,1)])
  18.     with open("result.txt", "a+") as f:
  19.         f.write(result+";"+"\n")
复制代码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 1# pan528
加强版推箱子
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "ELEMENTS=□■□○□◆我★"
  4. for /l %%N in (0,1,7) do (
  5. set P%%N=!ELEMENTS:~%%N,1!
  6. )
  7. for /f "delims=" %%A in ('more +30 "%~f0"') do (
  8. set "%%A" 2>NUL||echo -----------------%%A&&set L=0
  9. set/a L+=1
  10. if !L! gtr 5 (call :DISPLAY)
  11. )
  12. set/p=[1-开始]  [2-进度]  [3-说明]
  13. exit /b
  14. :DISPLAY
  15. for /l %%i in (1,1,%MapHeight%) do (
  16. set "DISPLAY=!MapData:~0,%MapWidth%!"
  17. set "MapData=!MapData:~%MapWidth%!"
  18. for /l %%N in (0,1,7) do (
  19. for %%P in (!P%%N!) do (
  20. set "DISPLAY=!DISPLAY:%%N=%%P!"
  21. )
  22. )
  23. echo;!DISPLAY!
  24. )
  25. echo Width:!MapWidth!  Height:!MapHeight!
  26. goto :EOF
  27. [Level 1]
  28. MapWidth=8
  29. MapHeight=8
  30. MapData=0011111011122210124212111212232112222121112122210162211101111100
  31. Title=Minicosmos 01
  32. Author=Aymeric du Peloux
  33. [Level 2]
  34. MapWidth=8
  35. MapHeight=9
  36. MapData=000011111111122112224221122312211121121112222221126122211221111111110000
  37. Title=Minicosmos 04
  38. Author=Aymeric du Peloux
复制代码

TOP

回复 9# happy886rr


    测试了一下,没有通过。谢谢回贴!

TOP

回复 9# happy886rr

测试了一下,只能显示最后一关。谢谢。

TOP

返回列表