标题: [已结]提取变量中的数字
[打印本页]
作者: 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