[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理怎样从特定区间提取出某个数?

起始号码                       结束号码                    号码状态
70002346076                 70002346085           1113111111
668849501                     668849510               3111311111
        ........        .........       .........

第一行   70002346076 -70002346085  是连继的十个数字,代表十张票据号码,  如果票被使用了,标志为1 ,也就是后面的号码状态..如果没有被使用,标志就为3,,,,,号码状态下面一共十个数字,依次分别对应起始号码到结束号码的十个连续票号....

明白了吗?

如上:  
       70002346076     对应号码状态中的第一个1,70002346079对应的是3,  我现在需要把所有对应状态为3的号码提取出来,生成一个文本.




四楼完美解决,
五楼,闪一下没反应,
七楼也是完美解决,
谢谢各位,呵呵,明天拿单位试试,啥时候水平能赶上你们呢?


[ 本帖最后由 worldsun 于 2010-4-2 17:11 编辑 ]
1

评分人数

    • namejm: 感谢主动给标题标注[已解决]字样PB + 2

以顶楼的两行数据为例,你想得到的结果是什么?

TOP

楼主你能把问题说得清楚点吗?
我想没人看得懂你到底在说什么
请在顶楼更新你的帖子
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  1. @echo off
  2. set "File=a.txt"
  3. for %%a in ("%File%") do set Output=%%~dpna_NotUsed%%~xa
  4. SetLocal EnableDelayedExpansion
  5. (for /f "usebackq tokens=1,3" %%a in ("!File!") do (
  6.     set StateList=%%b
  7.     if "!StateList:3=!" neq "!StateList!" (
  8.         set Num=%%a
  9.         for /l %%n in (0 1 9) do (
  10.             set State=!StateList:~%%n,1!
  11.             if "!State!"=="3" (
  12.                 Rem 因为批处理最大只能计算到十位数,为 2147483647,所以取号码的后九位进行计算。
  13.                 Rem 避免取出的九位数的第一个数为 0,计算时 0 会丢失,所以在九位数前补一个 1。
  14.                 set /a Num_R9 = 1!Num:~-9! + %%n
  15.                 echo !Num:~,-9!!Num_R9:~1!
  16.             )
  17.         )
  18.     )
  19. )) > "!Output!"
  20. start "" "!Output!"
复制代码

TOP

每个数字前,输出了在每行的位移值,不要可以去掉
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-11" %%a in (a.txt) do call :ech1 %%k %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j & echo;
  4. goto :eof
  5. :ech1
  6. set str=%1& set /a n=-1
  7. :ech2
  8. for /f "tokens=1*" %%x in ("%*") do (
  9.     set yy=%%y
  10.     if %n% GEQ 0 (
  11.       set str1=!str:~%n%,1!
  12.       if !str1! EQU 3 set/p "=%n%:%%x ,"<nul
  13.       )
  14.      set /a n+=1
  15.      if defined yy call :ech2 %%y
  16.      exit /b 0
  17.     )
复制代码

[ 本帖最后由 caruko 于 2010-4-2 13:20 编辑 ]

TOP

咳..没注意数字是连续的,所以当作字符串来做..效率估计不如4楼,,好处是可以处理字符串
另外看到下面的一排..... ,以为是有10个数字,外加11311是11列..
原来只有3列..

原本打算用call +shift /1 , 然后判断1/3 来输出 %1
结果在FOR中shift后,%1 也不扩展,只好用tokens=1,2* ,然后重复调用来截取字符串了

[ 本帖最后由 caruko 于 2010-4-2 14:33 编辑 ]

TOP

  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. for /f "skip=1 tokens=1,3" %%a in (b.txt) do (
  3.   set xx=%%a&set x=%%b
  4.   for /l %%i in (0 1 9) do if "!x:~%%i,1!"=="3" (
  5.       set /a #=100!xx:~-2!+%%i-10000,##=!xx:~0,-2!
  6.   if !#! lss 10 set #=0!#!
  7.    echo.!##!!#!
  8.    )
  9. )>>状态为3.txt
复制代码

[ 本帖最后由 yangfengoo 于 2010-4-2 14:24 编辑 ]

TOP

原帖由 bat007 于 2010-4-1 22:30 发表
以顶楼的两行数据为例,你想得到的结果是什么?




找到所有没有使用的票号

TOP

四楼完美解决,
五楼,闪一下没反应,
七楼查找出第二行的数据,第一行漏掉,可能第一行是超过十位了,

谢谢各位,呵呵,明天拿单位试试,啥时候水平能赶上你们呢?

TOP

回复 9楼 的帖子

我以为第一行是
起始号码                       结束号码                    号码状态

所以忽略了
把 skip=1 去掉即可

TOP

七楼的我修改后又试了一下,成功了,,我现在连代码都看不懂,丢人啊.呵呵

TOP

回复 11楼 的帖子

哪里看不懂,咋不问呢?

TOP

回复 12楼 的帖子

不好意思问,我正在自已学,不好意思麻烦同志们,怕问的太简单,丢人,呵呵

TOP

回复 13楼 的帖子

知之为知之,不知为不知,是知也。

TOP

返回列表