Board logo

标题: [已结]提取变量中的数字 [打印本页]

作者: flybird2020     时间: 2009-5-19 00:20    标题: [已结]提取变量中的数字

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 ]
作者: mac007cn     时间: 2009-5-19 00:25
写个C程序能实现。
作者: flybird2020     时间: 2009-5-19 00:26


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

只想用批处理,谢谢哥们儿。
作者: netbenton     时间: 2009-5-19 02:03

@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

作者: tireless     时间: 2009-5-19 03:21

@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 ]
作者: yangfengoo     时间: 2009-5-19 03:33

@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
    )
楼主的方法用临时文件快些。
作者: yangfengoo     时间: 2009-5-19 03:35


  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 ...

汗,偶是菜鸟完全看不懂,▓ 特殊符号有什么作用啊
作者: tireless     时间: 2009-5-19 03:50
把整句替换成

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 ]
作者: yangfengoo     时间: 2009-5-19 04:06
绕了好多弯哦。
作者: netbenton     时间: 2009-5-19 10:09
取长补短,得出高效代码如下:
@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

作者: netbenton     时间: 2009-5-19 10:36
::取出文本内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

作者: terse     时间: 2009-5-20 01:44
我前面先定义下 可行吗
@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