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 "">>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
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 "" vv.txt>>b.txt
del vv.txt
)

楼主的方法用临时文件快些。

作者: yangfengoo     时间: 2009-5-19 03:35
Originally posted by tireless at 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.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