中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [已结]提取变量中的数字 上一主题 | 下一主题
flybird2020
初级用户





积分 103
发帖 52
注册 2007-4-13
状态 离线
『楼 主』:  [已结]提取变量中的数字

a.txt内容如下:
DOS<Disk Operating System>,代表着136598自由开放与发展,我们努力064025起来,学习FreeDOS和Linux的自由12开放与GNU精789542神,共同创造和发展美好的88自由321546与GNU GPL世界吧!
希望得到结果如下:
136598
064025
789542
321546
只提取连续6个数字,每个数字换行输出。

目前我写的代码(效率很低):
@echo off&&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
set var=%%a
for /l %%i in (0,1,200) do (
set checkvar=!var:~%%i,6!
echo !checkvar!|findstr "[0-9][0-9][0-9][0-9][0-9][0-9]">>b.txt
))
pause.
望达人指点,如何修改以提高效率
谢谢大家,我采用了netbenton的代码,受益非浅。
[ Last edited by flybird2020 on 2009-5-20 at 03:01 ]

2009-5-19 00:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mac007cn
初级用户





积分 46
发帖 18
注册 2009-4-3
状态 离线
『第 2 楼』:  

写个C程序能实现。

2009-5-19 00:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flybird2020
初级用户





积分 103
发帖 52
注册 2007-4-13
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by mac007cn at 2009-5-19 12:25 AM:
写个C程序能实现。

只想用批处理,谢谢哥们儿。

2009-5-19 00:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 4 楼』:  


@echo off&setlocal enabledelayedexpansion
set "str=DOS<Disk Operating System>,代表着136598自由开放与发展,我们努力064025起来,学习FreeDOS和Linux的自由12开放与GNU精789542神,共同创造和发展美好的88自由321546与GNU GPL世界吧!"
:lp
(if not defined str goto :ok 2>nul
if "!str:~,1!" leq "9" (
     if "!str:~,1!" geq "0" (
        set kk=1!str!&set /a num=kk>nul
        for %%a in (!num:~1!) do (
                set str=!str:*%%a=!
                if "!num:~5!" neq "" echo %%a
        )       
        goto :lp
    )
)
set str=!str:~1!&goto :lp)
:ok
pause


   此帖被 +2 点积分    点击查看详情   
评分人:【 flybird2020 分数: +2  时间:2009-5-20 23:02




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-5-19 02:03
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 5 楼』:  


@echo off&setlocal enabledelayedexpansion
(for /f "tokens=*" %%a in (a.txt) do (
  set str=%%a▓
  for /l %%a in (0 1 9) do set str=!str:%%a=▓%%a!
  call :loop
))>b.txt
exit /b

:loop
if "!str:*▓=!"=="" (goto :eof) else set str=!str:*▓=!
set var=!str:~,11!
set /a !var:▓=! 2>nul && (
  if "!str:~11,1!" neq "▓" set "str=!str:~11!" & echo !var:▓=!
) || for /f "tokens=* delims=0123456789▓" %%a in ("!str!") do set str=%%a
goto loop
[ Last edited by tireless on 2009-5-19 at 04:26 ]

2009-5-19 03:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yangfengoo
初级用户




积分 47
发帖 41
注册 2009-4-24
状态 离线
『第 6 楼』:  


@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%a in (a.txt) do ( set var=%%a
  for /f "skip=1 delims=:" %%a in ('^(echo "!var!"^&echo.^)^|findstr /o ".*"') do set /a length=%%a-5
  for /l %%i in (0,1,!length!) do if "!var:~%%i,6!" leq "9" if "!var:~%%i,6!" geq "0" echo !var:~%%i,6!>>vv.txt
  findstr "[0-9][0-9][0-9][0-9][0-9][0-9]" vv.txt>>b.txt
  del vv.txt
    )
楼主的方法用临时文件快些。



正在学习中……
2009-5-19 03:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yangfengoo
初级用户




积分 47
发帖 41
注册 2009-4-24
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by tireless at 2009-5-19 03:21:
[code]@echo off&setlocal enabledelayedexpansion
(for /f "tokens=*" %%a in (a.txt) do (
  set str=%%a▓
  for /l %%a in (0 1 9) do set str=!str:%%a=▓%%a!
  call :loop
))>b.t ...

汗,偶是菜鸟完全看不懂,▓ 特殊符号有什么作用啊



正在学习中……
2009-5-19 03:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 8 楼』:  

把整句替换成

DOS<Disk Operating System>,代表着▓1▓3▓6▓5▓9▓8自由开放与发展,我们努力▓0▓6▓4▓0▓2▓5起来,学习FreeDOS和Linux的自由▓1▓2开放与GNU精▓7▓8▓9▓5▓4▓2神,共同创造和发展美好的▓8▓8自由▓3▓2▓1▓5▓4▓6与GNU GPL世界吧!▓

然后 set str=!str:*▓=! 就变成了

1▓3▓6▓5▓9▓8自由开放与发展,我们努力▓0▓6▓4▓0▓2▓5起来,学习FreeDOS和Linux的自由▓1▓2开放与GNU精▓7▓8▓9▓5▓4▓2神,共同创造和发展美好的▓8▓8自由▓3▓2▓1▓5▓4▓6与GNU GPL世界吧!▓

然后 set var=!str:~,11!,再判断 !var:▓=! 是不是纯数字...

循环...


[ Last edited by tireless on 2009-5-19 at 04:26 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 yangfengoo 分数: +1  时间:2009-5-19 03:54


2009-5-19 03:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yangfengoo
初级用户




积分 47
发帖 41
注册 2009-4-24
状态 离线
『第 9 楼』:  

绕了好多弯哦。



正在学习中……
2009-5-19 04:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 10 楼』:  

取长补短,得出高效代码如下:
@echo off&setlocal enabledelayedexpansion
(for /f "tokens=*" %%a in (a.txt) do (
  set str=@%%a
  for /l %%a in (0 1 9) do set str=!str:%%a=▓!
  set var=@%%a
  for %%b in (!str:▓^=,!) do (
      set var=1!var:*%%~b=!
        set/a n=var
        if "!n:~6,1!" neq "" echo !n:~1!
  )
))>b.txt
pause
exit /b




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-5-19 10:09
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 11 楼』:  

::取出文本内6位数以上的数字
::兼容大部分特殊情况
@echo off&setlocal enabledelayedexpansion
(for /f "tokens=*" %%a in (a.txt) do (
  set str=@%%a
  set str=!str:"=!
  for /l %%a in (0 1 9) do set str=!str:%%a=" "!
  set var=@%%a
  set var=!var:"=!
  for %%b in ("!str!") do (
      if %%b neq "" (set var=1!var:*%%~b=!
        set/a n=var
        if "!n:~6,1!" neq "" echo !n:~1!
      )
  )
))
pause
exit /b


   此帖被 +17 点积分          点击查看详情   
评分人:【 tireless 分数: +15  时间:2009-5-19 12:51
评分人:【 flybird2020 分数: +2  时间:2009-5-20 23:03




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-5-19 10:36
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 12 楼』:  

我前面先定义下 可行吗
@echo off
for /l %%i in (0,1,9) do set "_%%i=%%i"
    for /f "delims=" %%a in (a.txt) do (
        set "var=%%a"&set n=0
        setlocal enabledelayedexpansion
        for /l %%i in (0,1,200) do (
           set v=!var:~%%i,1!
           if defined _!v! (set/a n+=1&set str=!str!!v!) else (
           if !n! geq 6 echo !str!
           set "n=0"&set "str="
           ))
           endlocal
      )
pause




简单!简单!再简单!
2009-5-20 01:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: