找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24354|回复: 8

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

[复制链接]
发表于 2010-3-31 20:45:38 | 显示全部楼层 |阅读模式
各位老师,再次来请教一个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 编辑 ]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢主动给标题标注[已解决]字样

查看全部评分

发表于 2010-3-31 22:05:34 | 显示全部楼层
%%a是代表1-5,30-35应该是%%b,60-68是%%c。
 楼主| 发表于 2010-3-31 23:23:15 | 显示全部楼层
好像变量%%a扩展到后面,就没办法取到具体数值了:(
发表于 2010-3-31 23:29:52 | 显示全部楼层
参考:批处理超越for命令tokens极限分割字符串
http://www.bathome.net/thread-5548-1-1.html
 楼主| 发表于 2010-4-1 10:31:03 | 显示全部楼层
谢谢bat007,但我还是没有调试成功,55555555555
发表于 2010-4-1 11:51:12 | 显示全部楼层
你这个看起来就是高级语言中数组的样子嘛,批处理本身不好搞,可以借助其他脚本来完成:
  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
复制代码

评分

参与人数 1PB +8 收起 理由
Batcher + 8 乐于助人

查看全部评分

 楼主| 发表于 2010-4-1 12:00:41 | 显示全部楼层
没什么可说的,完全处在惊讶状态。Spring真是高手,完全符合要求,谢谢谢谢。这个问题比自己想象中的要难太多。唉
发表于 2011-5-18 11:09:14 | 显示全部楼层
批处理可以

  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
复制代码
发表于 2011-5-18 14:23:32 | 显示全部楼层
纯批处理也不难,因为楼主给定的数字刚好在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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:30 , Processed in 0.025544 second(s), 20 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表