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

【练习-007】批处理去除指定字符前所有的0

[复制链接]
 楼主| 发表于 2008-8-8 17:15:13 | 显示全部楼层
感谢大家对本贴的关注,其实我出这道题目的根本目的在于充分开放大家的思路,
本来去除指定字符前的0字符最保险的方法就是逐字符判断法,但这种办法的效率
是可想而知的,一旦要处理的字符量巨大的话,将会损耗我们大量的时间,所以要
求大家针对具体问题找出简洁高效的解决方案。所以对于代码是否通用性强其实并
不是我们所要考虑的主要问题,而大家所讨论的焦点无疑放在了代码的通用性上,
我认为这就偏离了我们所要研究的核心(当然并不是说代码的通用性不重要),所
以请后面跟贴的朋友将讨论重心放在思路和技巧上。
发表于 2009-4-26 17:23:33 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (1.txt) do (
  3.     set v=%%i
  4.     if "!v:~0,1!"=="a" (echo !v!) else (
  5.     for /f "tokens=1,2 delims=a" %%j in ("%%i") do (
  6.         set str=%%j
  7.         set str=!str:0=!
  8.         echo !str!a%%k
  9. )))
  10. pause
复制代码
发表于 2009-4-26 17:34:59 | 显示全部楼层
我的思路跟10楼batman的基本一样,可是处理上,还是batman更厉害!
关键是在处理a0000000这行,batman 直接判断以a为分割后第二字段是否为空,就直接解决问题了,佩服!!!
发表于 2009-4-26 17:54:13 | 显示全部楼层

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in (1.txt) do (
  3. set str=%%i
  4. set str1=!str:*a=a!
  5. call set tmp=%%str:!str1!=%%
  6. if not "!tmp!"=="" (call set str0=%%tmp:0=%%) else set "str0="
  7. echo !str0!!str1!
  8. )
  9. pause
复制代码


补上。

[ 本帖最后由 inittab 于 2009-4-27 09:11 编辑 ]
发表于 2009-4-26 22:19:12 | 显示全部楼层
没有if 不用for,只set 搞定,效率高,通用性:无特殊字符的各种情形均可通过。
  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3.    set "str=%%i"
  4.    setlocal enabledelayedexpansion
  5.    set "a=!str:*a=a!"
  6.    set "b=!a:0=!##
  7.    set str=!str:0=!##
  8.    call echo.%%str:!b!=!a!%%
  9.    endlocal
  10. )
  11. pause
复制代码

[ 本帖最后由 netbenton 于 2009-4-27 19:12 编辑 ]
发表于 2009-4-27 02:09:45 | 显示全部楼层
  1. for /f "tokens=* delims=0" %%i in (1.txt) do echo %%i
复制代码

评分

参与人数 1PB +5 收起 理由
nanhui + 5 顶!!

查看全部评分

发表于 2009-4-27 09:11:08 | 显示全部楼层
ls看错题了。呵呵
我也看错。现在改正过来了。
发表于 2009-4-27 13:03:11 | 显示全部楼层
题目出重了。

[ 新手习题] 批处理去除字符串前所有的0
http://www.bathome.net/thread-3086-1-2.html
发表于 2009-4-27 13:22:34 | 显示全部楼层

回复 38楼 的帖子

嗯,练功区的那个是重复的吧,晚了差不多半年时间呢。

本帖发表于 2008-8-1 22:37
彼帖发表于 2009-1-15 18:46
发表于 2009-4-27 20:04:18 | 显示全部楼层

回复 42楼 的帖子

什么叫“反驳”?大家都是因为爱好批处理才走到一起的,彼此切磋才能更快提高,何来反驳之谈?谁闲着没事去到处反驳?
发表于 2009-6-22 17:15:07 | 显示全部楼层
我看错了题目,只去掉a前面紧挨着的0,难度大了很多。已经写出来,就贴在这里算了
  1. @echo off&setlocal enabledelayedexpansion
  2. set "var=a b c d e f g h i j k l m n o p q r s t u v w x y z"
  3. for /f %%a in (a.txt) do (
  4.     set str=%%a
  5.     for %%b in (%var%) do (
  6.         set "str=!str:%%b= %%b !"
  7.     )
  8.     for %%c in (!str!) do (
  9.         if defined s (
  10.             if !s! neq 0 (<nul set/p=!s!) else (
  11.                 if %%c neq a <nul set/p=!s!
  12.              )
  13.         )
  14.         set "s=%%c"
  15.     )
  16.     <nul set/p=!s!&echo/&set "s="
  17. )
  18. pause
复制代码
发表于 2010-6-15 05:58:13 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,* delims=a" %%a in (a.txt) do (
  3.   if "%%b"=="" (set stt=%%a) else (set str=%%a & set stt=%%b)
  4.   set str=!str:0=!
  5.   echo.%str%a!stt!
  6. )
  7. pause
复制代码
好像测试版主给的另外一组数据也可以

没有想到顶了老帖子了,只是发现我的这个代码还是有点意思就发了。

[ 本帖最后由 sgaizxt001 于 2010-6-15 06:08 编辑 ]
发表于 2011-7-28 14:02:30 | 显示全部楼层
  1. @echo off&SetLocal EnableDelayedExpansion
  2. (For /f "tokens=1* delims=a" %%i in (1.txt) do (Set a=%%i
  3. Set b=!a:0=!
  4. echo !b!a%%j ))>2.txt
  5. pause
复制代码
本以为解决了,不过BatMan很坏,留了个陷阱——a0000000。

明天继续想想。
发表于 2011-9-3 20:58:05 | 显示全部楼层
回复 9# pusofalse

这句怎么解释啊 。call echo   在这里是什么意思啊?
     call,echo.%%var:0=%%a%%str%%
发表于 2011-9-3 21:28:07 | 显示全部楼层
求加分
  1. sed -e "s/^0*//" 1.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:05 , Processed in 0.022985 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表