标题: [文本处理] [已解决]批处理怎样从特定区间提取出某个数? [打印本页]
作者: worldsun 时间: 2010-4-1 21:42 标题: [已解决]批处理怎样从特定区间提取出某个数?
起始号码 结束号码 号码状态
70002346076 70002346085 1113111111
668849501 668849510 3111311111
........ ......... .........
第一行 70002346076 -70002346085 是连继的十个数字,代表十张票据号码, 如果票被使用了,标志为1 ,也就是后面的号码状态..如果没有被使用,标志就为3,,,,,号码状态下面一共十个数字,依次分别对应起始号码到结束号码的十个连续票号....
明白了吗?
如上:
70002346076 对应号码状态中的第一个1,70002346079对应的是3, 我现在需要把所有对应状态为3的号码提取出来,生成一个文本.
四楼完美解决,
五楼,闪一下没反应,
七楼也是完美解决,
谢谢各位,呵呵,明天拿单位试试,啥时候水平能赶上你们呢?
[ 本帖最后由 worldsun 于 2010-4-2 17:11 编辑 ]
作者: bat007 时间: 2010-4-1 22:30
以顶楼的两行数据为例,你想得到的结果是什么?
作者: namejm 时间: 2010-4-1 22:38
楼主你能把问题说得清楚点吗?
我想没人看得懂你到底在说什么
请在顶楼更新你的帖子
作者: test2010 时间: 2010-4-2 12:38
- @echo off
- set "File=a.txt"
-
- for %%a in ("%File%") do set Output=%%~dpna_NotUsed%%~xa
-
- SetLocal EnableDelayedExpansion
-
- (for /f "usebackq tokens=1,3" %%a in ("!File!") do (
- set StateList=%%b
- if "!StateList:3=!" neq "!StateList!" (
- set Num=%%a
- for /l %%n in (0 1 9) do (
- set State=!StateList:~%%n,1!
- if "!State!"=="3" (
- Rem 因为批处理最大只能计算到十位数,为 2147483647,所以取号码的后九位进行计算。
- Rem 避免取出的九位数的第一个数为 0,计算时 0 会丢失,所以在九位数前补一个 1。
- set /a Num_R9 = 1!Num:~-9! + %%n
- echo !Num:~,-9!!Num_R9:~1!
- )
- )
- )
- )) > "!Output!"
-
- start "" "!Output!"
复制代码
作者: caruko 时间: 2010-4-2 13:17
每个数字前,输出了在每行的位移值,不要可以去掉- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1-11" %%a in (a.txt) do call :ech1 %%k %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j & echo;
- goto :eof
-
- :ech1
- set str=%1& set /a n=-1
- :ech2
- for /f "tokens=1*" %%x in ("%*") do (
- set yy=%%y
- if %n% GEQ 0 (
- set str1=!str:~%n%,1!
- if !str1! EQU 3 set/p "=%n%:%%x ,"<nul
- )
- set /a n+=1
- if defined yy call :ech2 %%y
- exit /b 0
- )
复制代码
[ 本帖最后由 caruko 于 2010-4-2 13:20 编辑 ]
作者: caruko 时间: 2010-4-2 13:36
咳..没注意数字是连续的,所以当作字符串来做..效率估计不如4楼,,好处是可以处理字符串
另外看到下面的一排..... ,以为是有10个数字,外加11311是11列..
原来只有3列..
原本打算用call +shift /1 , 然后判断1/3 来输出 %1
结果在FOR中shift后,%1 也不扩展,只好用tokens=1,2* ,然后重复调用来截取字符串了
[ 本帖最后由 caruko 于 2010-4-2 14:33 编辑 ]
作者: yangfengoo 时间: 2010-4-2 14:12
- @echo off&setlocal ENABLEDELAYEDEXPANSION
- for /f "skip=1 tokens=1,3" %%a in (b.txt) do (
- set xx=%%a&set x=%%b
- for /l %%i in (0 1 9) do if "!x:~%%i,1!"=="3" (
- set /a #=100!xx:~-2!+%%i-10000,##=!xx:~0,-2!
- if !#! lss 10 set #=0!#!
- echo.!##!!#!
- )
- )>>状态为3.txt
复制代码
[ 本帖最后由 yangfengoo 于 2010-4-2 14:24 编辑 ]
作者: worldsun 时间: 2010-4-2 16:17
原帖由 bat007 于 2010-4-1 22:30 发表
以顶楼的两行数据为例,你想得到的结果是什么?
找到所有没有使用的票号
作者: worldsun 时间: 2010-4-2 16:29
四楼完美解决,
五楼,闪一下没反应,
七楼查找出第二行的数据,第一行漏掉,可能第一行是超过十位了,
谢谢各位,呵呵,明天拿单位试试,啥时候水平能赶上你们呢?
作者: yangfengoo 时间: 2010-4-2 16:40 标题: 回复 9楼 的帖子
我以为第一行是
起始号码 结束号码 号码状态
所以忽略了
把 skip=1 去掉即可
作者: worldsun 时间: 2010-4-2 17:09
七楼的我修改后又试了一下,成功了,,我现在连代码都看不懂,丢人啊.呵呵
作者: bat007 时间: 2010-4-2 17:43 标题: 回复 11楼 的帖子
哪里看不懂,咋不问呢?
作者: worldsun 时间: 2010-4-3 21:44 标题: 回复 12楼 的帖子
不好意思问,我正在自已学,不好意思麻烦同志们,怕问的太简单,丢人,呵呵
作者: bat007 时间: 2010-4-3 22:04 标题: 回复 13楼 的帖子
知之为知之,不知为不知,是知也。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |