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

[文本处理] [已解决]请教批处理文本截取的解决方法

各位老师,再次来请教一个for的用法。
我有一个文件sourcearray.txt,内容有如下数组:
a=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]
a=[30 96 162 228 294 360 426 492 558 624 690 756 822 888 954 1020 1086 1152 1218 1284 1350 1416 1482 1548 1614 1680 1746 1812 1878 1944 2010 2076 2142 2208 2274 2340 2406 2472 2538 2604 2670 2736 2802 2868 2934 3000 3066 3132 3198 3264 3330 3396 3462 3528 3594 3660 3726 3792 3858 3924 3990 4056 4122 4188 4254 4320 4386 4452 4518 4584 4650 4716 4782 4848 4914 4980 5046 5112 5178 5244 5310 5376 5442 5508 5574 5640 5706 5772 5838 5904 5970 6036 6102 6168 6234 6300 6366 6432 6498]

放两行供演示,现在,我想取每个数组的第1-5位,30-35位,60-68位,然后按下列方式输出到另外一个文本中。
b=[1 2 3 4 5 30 31 32 33 34 35 60 61 62 63 64 65 66 67 68]
b=[30 96 162 228 294 1944 2010 2076 2142 2208 2274 3924 3990 4056 4122 4188 4254 4320 4386 4452]

我写的代码如下,但存在问题,希望能得到各位老师的指导
  1. @echo off
  2. rem setlocal enabledelayedexpansion
  3. echo.>1.txt
  4. for /f "tokens=1-5,30-35,60-8 delims=a=[] " %%a in (sourcearray.txt) do (set nume=%%a echo b=[%num%]>>1.txt)
复制代码
sgaizxt001,您好,我已改成如下方式,依然得不到正确结果。
  1. @echo off
  2. rem setlocal enabledelayedexpansion
  3. echo.>1.txt
  4. for /f "tokens=1-3,30-35,60-68 delims=a=[] " %%a in (sourcearray.txt) do @echo b=[%%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v %%w %%x %%y %%z]>>1.txt
  5. PAUSE
复制代码

[ 本帖最后由 slovent 于 2010-4-1 12:00 编辑 ]
1

评分人数

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

%%a是代表1-5,30-35应该是%%b,60-68是%%c。

TOP

好像变量%%a扩展到后面,就没办法取到具体数值了:(

TOP

参考:批处理超越for命令tokens极限分割字符串
http://www.bathome.net/thread-5548-1-1.html

TOP

谢谢bat007,但我还是没有调试成功,55555555555

TOP

你这个看起来就是高级语言中数组的样子嘛,批处理本身不好搞,可以借助其他脚本来完成:
  1. @echo off
  2. set "sourceFile=sourcearray.txt"
  3. set "resultFile=resultarray.txt"
  4. setlocal enabledelayedexpansion
  5. echo>  Spring var a;
  6. echo>> Spring function f(b,c){var d="";for(var i=b;i^<c;i++)d+=a[i-1]+" ";d+=a[c-1];return d;}
  7. echo>> Spring function g(){var d="b=[";d+=f(1,5)+" "+f(30,35)+" "+f(60,68)+"]";WScript.Echo(d);}
  8. for /f "delims=" %%i in (%sourceFile%) do (
  9.   set "a=%%i"
  10.   set "a=!a: =,!"
  11.   echo>> Spring !a!;
  12.   echo>> Spring g^(^);
  13. )
  14. cscript -nologo -e:jscript Spring > "%resultFile%"
  15. del Spring
  16. echo ====== 完成 ======
  17. echo.
  18. echo 处理结果保存到了 "%resultFile%"
  19. pause>nul
复制代码
1

评分人数

TOP

没什么可说的,完全处在惊讶状态。Spring真是高手,完全符合要求,谢谢谢谢。这个问题比自己想象中的要难太多。唉

TOP

批处理可以
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (sourcearray.txt) do (
  3.    set "v=%%i"
  4.    set "v=!v:~3,-1!"
  5.    for %%i in (!v!) do (
  6.        set /a n+=1
  7.        if !n! leq 5 set "b=!b!%%i "
  8.        if !n! geq 30 if !n! leq 35 set "b=!b!%%i "
  9.        if !n! geq 60 if !n! leq 68 set "b=!b!%%i "
  10.    )
  11.    set n=
  12.    echo b=[!b:~,-1!]
  13.    set b=
  14. ))>c.txt
  15. start c.txt
复制代码

TOP

纯批处理也不难,因为楼主给定的数字刚好在tokens支持范围之内。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=[a=]" %%A in (1.txt) do (
  3. for /f "tokens=1-5,29*" %%a in ("%%A") do (
  4. set str=%%a %%b %%c %%d %%e
  5. for /f "tokens=1-5,30*" %%a in ("%%g") do (
  6. set str=!str! %%a %%b %%c %%d %%e
  7. for /f "tokens=1-9" %%a in ("%%g") do (
  8. set str=!str! %%a %%b %%c %%d %%e %%f %%g %%h %%i
  9. )
  10. )
  11. )
  12. echo b=[!str!]
  13. ))>2.txt
  14. pause
复制代码

TOP

返回列表