Board logo

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

作者: pdp320921    时间: 2010-12-22 19:27     标题: [已解决]批处理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 编辑 ]
作者: tmplinshi    时间: 2010-12-22 19:51

  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
复制代码

作者: pdp320921    时间: 2010-12-23 12:03

感谢2楼的分享。

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

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

怎么弄~~~~
作者: tmplinshi    时间: 2010-12-23 15:30

  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
复制代码

作者: pdp320921    时间: 2010-12-23 20:22

4楼没清楚的我意图

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

==>等待高手指点~~~~~
作者: hanyeguxing    时间: 2010-12-23 21:03

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 编辑 ]
作者: tmplinshi    时间: 2010-12-23 21:57

  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 编辑 ]
作者: hanyeguxing    时间: 2010-12-23 22:36     标题: 回复 7楼 的帖子

if !n! gtr !End! goto Finish 永远都不会执行,因为if !n!==12 set /a n = 0, var = 0
作者: tmplinshi    时间: 2010-12-23 22:51     标题: 回复 8楼 的帖子

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

[ 本帖最后由 tmplinshi 于 2010-12-23 23:04 编辑 ]
作者: pdp320921    时间: 2010-12-24 08:47

如果我还想 对所有的和都除以1000后得到小数结果,有解吗?
作者: tmplinshi    时间: 2010-12-24 13:20     标题: 回复 10楼 的帖子

要用一个 vbs

[ 本帖最后由 tmplinshi 于 2010-12-24 21:19 编辑 ]
作者: hanyeguxing    时间: 2010-12-24 17:40     标题: 回复 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 编辑 ]
作者: pdp320921    时间: 2010-12-24 19:34

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

补 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 编辑 ]
作者: pdp320921    时间: 2010-12-25 11:14     标题: 回复12楼的内容

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

tokens=1-3*==>什么意思?跟tokens=1-3,*意思一样吗?
'findstr /n .* myfile.txt 中的 .*代表文本的所有内容?
作者: pdp320921    时间: 2011-2-8 20:04     标题: 参数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
作者: tianhesong    时间: 2011-2-8 20:52     标题: 用 find 可以吗?请大侠给个 find 的例子!

我感觉用  for /f 的代码太多还要算算跳过多少行!  实在很麻烦耶!
能不能讨论一下用 find 来实现呢!
  find /i "第三行" myfile.txt|find /v "------"
  一样可以挑选出 想要的内容呀! 干麻每都要  for 他个一大串代码呢?看得我眼睛都晕了!
作者: tianhesong    时间: 2011-2-8 20:54     标题: 用 find 可以吗?请大侠给个 find 的例子!

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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2