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

[文本处理] [已解决]批处理for语句怎样提取文本中数据并计算?

  1. @echo off
  2. for "skip=10 delims=: tokens=2" %%i in (myfile.txt) do(
  3. set s1=%i
  4. call :next1)
  5. :next1
  6. for "skip=11 delims=: tokens=2" %%i in (myfile.txt) do(
  7. set s2=%i
  8. call :next2)
  9. :next2
  10. set  /a s=%s1%+%s2%
  11. echo %s
  12. pause
复制代码
我的意图:在myfile.txt中提取第11行和第12行的数据进行相加
运行以上代码后得不到想要的结果~~~请高手指教(多多益善)

[ 本帖最后由 pdp320921 于 2011-1-27 18:09 编辑 ]
1

评分人数

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

  1. @echo off
  2. for /f "skip=10 delims=: tokens=2" %%i in (myfile.txt) do (
  3.     if not defined n (
  4.         set n=%%i
  5.     ) else (
  6.         set /a n += %%i
  7.         goto end
  8.     )
  9. )
  10. :end
  11. echo %n%
  12. pause
复制代码
  1. @echo off
  2. for /f "skip=10 delims=: tokens=2" %%i in (myfile.txt) do (
  3.     set /a "n += %%i, line += 1, 1 / (2 - line)" || goto end
  4. ) 2>nul
  5. :end
  6. echo %n%
  7. pause
复制代码

TOP

感谢2楼的分享。

可是如果我提取的不止11 12行呢?

如果我想 提取第11行 和12行 数据相加 求和
                提取第23行 和24行 数据相加  求和         
                提取第35行 和36行 数据相加  求和
                ....
                ....
                ....
                .....
                 提取第83行 和84行 数据相加  求和

怎么弄~~~~

TOP

  1. @echo off
  2. set List=11 23 35 83
  3. SetLocal EnableDelayedExpansion
  4. for %%a in (%List%) do set Var%%a=0
  5. for /f "delims=: tokens=2" %%a in (myfile.txt) do (
  6.     set /a Line += 1
  7.     if defined LastLine (
  8.         set /a #!LastLine!_!Line! = Var!LastLine! + Line
  9.         set LastLine=
  10.     )
  11.     if defined Var!Line! set /a LastLine = Line, Var!Line! = %%a
  12. )
  13. set #
  14. pause
复制代码

TOP

4楼没清楚的我意图

我的意思是提取某个文件中的 11行数据+12行数据 求和
以后每隔12行提取数据       如  23行数据+24行数据 求和
以此类推 直到             提取到 83行数据+84行数据 求和

==>等待高手指点~~~~~

TOP

ANSI编码;空行也算在行号内:
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=11
  3. for /f "tokens=1-3* delims=:" %%a in ('findstr /n .* myfile.txt') do if %%a==!a! (
  4.         if "!b!"=="1" (set/a b=11,c+=%%c&echo !c!) else set/a b=1,c=%%c
  5.         set/a a+=b
  6. )
  7. pause
复制代码
如果文本行数远多于84,而只提取前84行,则:
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=11
  3. for /f "tokens=1-3* delims=:" %%a in ('findstr /n .* myfile.txt') do (
  4.         if %%a==!a! (
  5.                 if "!b!"=="1" (set/a b=11,c+=%%c&echo !c!) else set/a b=1,c=%%c
  6.                 set/a a+=b
  7.         )
  8.         if %%a==84 goto:end
  9. )
  10. :end
  11. pause
复制代码

如果要忽略空行以及;开头的行,则
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=11
  3. for /f "tokens=2 delims=:" %%a in (myfile.txt) do (
  4.         set/a n+=1
  5.         if !n!==!a! (
  6.                 if "!b!"=="1" (set/a b=11,c+=%%a&echo !c!) else set/a b=1,c=%%a
  7.                 set/a a+=b
  8.         )
  9.         if !n!==84 goto:end
  10. )
  11. :end
  12. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-23 21:24 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. set /a Start = 11, End = 83, Start -= 1, End -= Start
  4. for /f "skip=%Start% delims=: tokens=2" %%a in (myfile.txt) do (
  5.     set /a n += 1, var += %%a, End -= 1
  6.     if !n!==12 set /a n = 0, var = 0
  7.     if !n!==2 (
  8.         echo !var!
  9.         if !End! lss 0 goto Finish
  10.     )
  11. )
  12. :Finish
  13. pause
复制代码

[ 本帖最后由 tmplinshi 于 2010-12-23 22:58 编辑 ]

TOP

回复 7楼 的帖子

if !n! gtr !End! goto Finish 永远都不会执行,因为if !n!==12 set /a n = 0, var = 0
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 8楼 的帖子

确实,多谢指出,已修改。

[ 本帖最后由 tmplinshi 于 2010-12-23 23:04 编辑 ]

TOP

如果我还想 对所有的和都除以1000后得到小数结果,有解吗?

TOP

回复 10楼 的帖子

要用一个 vbs

[ 本帖最后由 tmplinshi 于 2010-12-24 21:19 编辑 ]

TOP

回复 10楼 的帖子

在批处理中,要想除1000并得到小数的话,可以对数字前补0,然后分隔加点.,(保留三位小数)
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=11
  3. for /f "tokens=2 delims=:" %%a in (myfile.txt) do (
  4.     set/a n+=1
  5.     if !n!==!a! (
  6.         if "!b!"=="1" (
  7.             set/a b=11,c+=%%a
  8.             if !c! lss 1000 (set c=000!c!&set c=0.!c:~-3!) else set c=!c:~0,-3!.!c:~-3!
  9.             echo !c!
  10.             ) else set/a b=1,c=%%a
  11.         set/a a+=b
  12.     )
  13.     if !n!==84 goto:end
  14. )
  15. :end
  16. pause
复制代码
如果装有Windows PowerShell,可以直接调用Windows PowerShell运算。
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=11
  3. for /f "tokens=2 delims=:" %%a in (myfile.txt) do (
  4.     set/a n+=1
  5.     if !n!==!a! (
  6.         if "!b!"=="1" (
  7.             set b=11
  8.             PowerShell ^(%%a+!c!^)/1000
  9.             ) else set/a b=1,c=%%a
  10.         set/a a+=b
  11.     )
  12.     if !n!==84 goto:end
  13. )
  14. :end
  15. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-24 20:52 编辑 ]
1

评分人数

    • tmplinshi: 方法很好,对于10的倍数的确实这样做很简便技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

我之前的想法跟12楼一样,但是“在批处理中,要想除1000并得到小数的话,可以对数字前补0,然后分隔加点.,(保留三位小数)”感觉是否已经偏离小数的本质,这样显示出来的数据还能进行其他算术运算?

TOP

补 0 的方法很好
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. set /a Start = 11, End = 83, Start -= 1, End -= Start, var = 1000
  4. for /f "skip=%Start% delims=: tokens=2" %%a in (myfile.txt) do (
  5.     set /a n += 1, var += %%a, End -= 1
  6.     if !n!==12 set /a n = 0, var = 1000
  7.     if !n!==2 (
  8.         echo 0.!var:~-3!
  9.         if !End! lss 0 goto Finish
  10.     )
  11. )
  12. :Finish
  13. pause
复制代码
原帖由 pdp320921 于 2010-12-24 19:34 发表
我之前的想法跟12楼一样,但是“在批处理中,要想除1000并得到小数的话,可以对数字前补0,然后分隔加点.,(保留三位小数)”感觉是否已经偏离小数的本质,这样显示出来的数据还能进行其他算术运算?

当然可以,不过批处理计算小数是很麻烦的(参见 【练习-034】批处理浮点计算),可借用 vbs 等工具来计算。

[ 本帖最后由 tmplinshi 于 2010-12-24 22:17 编辑 ]

TOP

回复12楼的内容

能帮忙注解下你的代码吗?有些乱, 参数 a ,b, c都代表什么?

tokens=1-3*==>什么意思?跟tokens=1-3,*意思一样吗?
'findstr /n .* myfile.txt 中的 .*代表文本的所有内容?

TOP

返回列表