[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

用 find 可以吗?请大侠给个 find 的例子!

我感觉用  for /f 的代码太多还要算算跳过多少行!  实在很麻烦耶!
能不能讨论一下用 find 来实现呢!
  find /i "第三行" myfile.txt|find /v "------"
  一样可以挑选出 想要的内容呀! 干麻每都要  for 他个一大串代码呢?看得我眼睛都晕了!

TOP

用 find 可以吗?请大侠给个 find 的例子!

我感觉用  for /f 的代码太多还要算算跳过多少行!  实在很麻烦耶!
能不能讨论一下用 find 来实现呢!
  find /i "第三行" myfile.txt|find /v "------"
  一样可以挑选出 想要的内容呀! 干麻每都要  for 他个一大串代码呢?看得我眼睛都晕了!

TOP

参数a,b,c都代表什么?

@echo off&setlocal enabledelayedexpansion
set a=11
for /f "tokens=2 delims=:" %%a in (myfile.txt) do (
    set/a n+=1
    if !n!==!a! (
        if "!b!"=="1" (
            set/a b=11,c+=%%a
            if !c! lss 1000 (set c=000!c!&set c=0.!c:~-3!) else set c=!c:~0,-3!.!c:~-3!
            echo !c!
            ) else set/a b=1,c=%%a
        set/a a+=b
    )
    if !n!==84 goto:end
)
:end
pause

TOP

回复12楼的内容

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

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

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

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

回复 10楼 的帖子

要用一个 vbs

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

TOP

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

TOP

回复 8楼 的帖子

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

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

TOP

回复 7楼 的帖子

if !n! gtr !End! goto Finish 永远都不会执行,因为if !n!==12 set /a n = 0, var = 0
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 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

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

4楼没清楚的我意图

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

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

TOP

返回列表