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

【练习-023】按要求替换文本字符的批处理

前言:
  本人最近眼睛出了毛病,所以不能常在论坛和群里为大家服务了,在此深表遗憾,也请
大家予以谅解。
  今天帮同事解决了一个工作上的小问题,觉得这个问题比较有代表性,所以整理了下出
了这题(个人无法在excel表格中完成操作,不知有高人能否做到)。
出题目的:
  唯一的目的在于通过解题灵活掌握字符替换技巧
加分原则:
  1 思路新颖基分5分
  2 代码高效基分4分
  3 代码简洁基分3分
  4 代码通用基分2分
  5 无临时文件基分1分
  6 完美代码加15分
题目如下:
  有a.txt内容如下(在实际中有数万行)
  1. 330001--330002--330106
  2. 330001--330006--330108
  3. 330001--330007--330112
  4. 330101--330108--330205
  5. 330101--330110--330212
  6. 330201--330211--330301
  7. 330302--330304--330309
  8. 330302--330308--330402
  9. 330302--330410--330408
  10. 330402--330406--330411
  11. 330505--330511--330807
复制代码
  要求用批处理对字符进行逐行替换,将其中的330**替换为200*年*月,但不允许
出现05月(正确为5月)字样,同时输出如下:
  1. 2000年1月--2000年2月--2001年6月
  2. 2000年1月--2000年6月--2001年8月
  3. 2000年1月--2000年7月--2001年12月
  4. 2001年1月--2001年8月--2002年5月
  5. 2001年1月--2001年10月--2002年12月
  6. 2002年1月--2002年11月--2003年1月
  7. 2003年2月--2003年4月--2003年9月
  8. 2003年2月--2003年8月--2004年2月
  9. 2003年2月--2004年10月--2004年8月
  10. 2004年2月--2004年6月--2004年11月
复制代码

[ 本帖最后由 batman 于 2008-9-24 08:03 编辑 ]
***共同提高***

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f %%i in (a.txt) do (
  4.     set str=%%i
  5.     set str=20!str:~2,2!年!str:~4,2!月--20!str:~10,2!年!str:~12,2!月--20!str:~18,2!年!str:~20,2!月
  6.     echo !str:年0=年!
  7. )
复制代码

TOP

我这代码效率不高,仅能做对而已
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-3 delims=--"  %%i in (a.txt) do (
  3. call :aa %%i
  4. call :aa %%j
  5. call :aa %%k
  6. echo !b:~2!
  7. set b=
  8. )
  9. pause>nul
  10. goto :eof
  11. :aa
  12. set a=%1
  13. set a=!a:330=200!
  14. set a1=!a:~0,4!年
  15. set a2=!a:~-2!
  16. if !a2! lss 10 (set a2=!a2:~-1!) else (set a2=!a2:~-2!)
  17. set a=!a1!!a2!月
  18. set b=!b!--!a!
复制代码
1

评分人数

    • keen: 效率的确不高,可以再该进!PB + 5

TOP

sed s/330/200/g;s/--/\n/g a.txt|sed "s/200./&年/;s/$/月/;s/年0/年/"|sed N;N;s/\n/--/|sed N;s/\n/--/
其实允许2009年01月形式的话,会少很多代码而且格式也工整。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-3 delims=-" %%a in (a.txt) do (
  3.     set/a y1=%%a/100,y1-=1300,m1=%%a%%100,y2=%%b/100,y2-=1300,m2=%%b%%100,y3=%%c/100,y3-=1300,m3=%%c%%100
  4.     echo !y1!年!m1!月--!y2!年!m2!月--!y3!年!m3!月
  5. )
  6. pause
复制代码
1

评分人数

    • curious: 纯数学解决,实在是高!PB + 3

TOP

当然,如果数很多占用内存就多,
就本题而言,仅仅为:年数*12而已,就算是跨100年,也不过1200个变量定义。
在具体使用时,就要看实际情况了,如果“定义体”比“循环体”要大,则不应该使用变量定义。

TOP

回复 17楼 的帖子

netbenton兄的想法实在是妙,效率也高,但是付出了内存的代价!
如果这样的数很多,占用内存会很大。
(*^_^*)

TOP

::要想高效,利用变量定义,尽量减少循环体内的代码!
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (3300,1,3315) do (
  3. set #a=%%a
  4. for /l %%b in (1,1,9) do (set %%a0%%b=20!#a:~2,2!年%%b月)
  5.         for %%b in (10 11 12) do (set %%a%%b=20!#a:~2,2!年%%b月)
  6. )
  7. for /f "tokens=*" %%a in (a.txt) do (
  8.     for /f "tokens=1-3 delims=-" %%b in ("%%a") do (echo !%%b!--!%%c!--!%%d!)
  9. )
  10. echo.&pause
复制代码

TOP

回复 5楼 的帖子

shift用法妙,但call :lp进行循环,效率可能不高吧!
(*^_^*)

TOP

发现跟pusofalse版主在三楼的一样了!
(*^_^*)

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in (a.txt) do (
  3.     set str=%%i&set str=!str:--= !&set "v="
  4.     for %%j in (!str!) do (
  5.         set var=%%j&set var=!var:330=200!
  6.         set var1=!var:~0,4!
  7.         if "!var:~-2,1!" equ "0" (set var2=!var:~-1,1!) else (set var2=!var:~-2,2!)
  8.         set v=!v!!var1!年!var2!月--
  9.       
  10. )
  11. echo !v:~0,-2!
  12. )
  13. pause
复制代码
(*^_^*)

TOP

我在excel中用分列去掉--,然后用公式=LEFT(REPLACE(A1,1,3,200),4)&"年"&(RIGHT(A1,2)*1)&"月",向右向下一拉就成了。

TOP

原帖由 bater 于 2008-9-12 09:11 发表
呵呵,是我没有读懂题目,我首先把你A.txt的 数据利用
替换把-- 换成空格  ,然后由excel的数据导入进去
所以得到的数据,是没有--的,又看了下题目正如你说的用&把“--”是可以的,总之,我的excle老师告诉我,在 ...

兄弟太客气了,呵呵,咱们一起学习,共同进步了。
***共同提高***

TOP

呵呵,是我没有读懂题目,我首先把你A.txt的 数据利用
替换把-- 换成空格  ,然后由excel的数据导入进去
所以得到的数据,是没有--的,又看了下题目正如你说的用&把“--”是可以的,总之,我的excle老师告诉我,在excle下能得到正确答案,就是好的,因为,效率已经比
手动修改,提高很多了.
另外,在论坛学习了你很多的p处理知识。希望能从你身上学到更多的知识!

TOP

原帖由 bater 于 2008-9-11 22:03 发表
在空白单元里输入公式=LEFT(REPLACE(A1,1,3,200),4)&"年"&RIGHT(A1,2)&"月"然后按照内容多少把数据全部选中后,全部数据转换成下列:
  

2000年01月 2000年02月 2001年06月 2000年01月  200 ...

本人实是愚钝,照兄弟所述的在excel中搞了半天,硬是不得法,没有成功转换,汗。。。

本人也摸索了一个公式:=MID(B1,1,4)&"年"&MID(B1,5,2)&"月"&"--"&MID(B1,9,4)&"年"&MID(B1,13,2)&"月"&"--"&MID(B1,17,4)&"年"&MID(B1,21,2)&"月",基本上能达到替换的要求了。。。

[ 本帖最后由 batman 于 2008-9-12 08:42 编辑 ]
***共同提高***

TOP

返回列表