标题: [文本处理] [已解决]批处理for语句怎样提取文本中数据并计算? [打印本页]
作者: pdp320921 时间: 2010-12-22 19:27 标题: [已解决]批处理for语句怎样提取文本中数据并计算?
- @echo off
- for "skip=10 delims=: tokens=2" %%i in (myfile.txt) do(
- set s1=%i
- call :next1)
- :next1
- for "skip=11 delims=: tokens=2" %%i in (myfile.txt) do(
- set s2=%i
- call :next2)
- :next2
- set /a s=%s1%+%s2%
- echo %s
- pause
复制代码
我的意图:在myfile.txt中提取第11行和第12行的数据进行相加
运行以上代码后得不到想要的结果~~~请高手指教(多多益善)
[ 本帖最后由 pdp320921 于 2011-1-27 18:09 编辑 ]
作者: tmplinshi 时间: 2010-12-22 19:51
- @echo off
- for /f "skip=10 delims=: tokens=2" %%i in (myfile.txt) do (
- if not defined n (
- set n=%%i
- ) else (
- set /a n += %%i
- goto end
- )
- )
-
- :end
- echo %n%
- pause
复制代码
- @echo off
- for /f "skip=10 delims=: tokens=2" %%i in (myfile.txt) do (
- set /a "n += %%i, line += 1, 1 / (2 - line)" || goto end
- ) 2>nul
-
- :end
- echo %n%
- pause
复制代码
作者: pdp320921 时间: 2010-12-23 12:03
感谢2楼的分享。
可是如果我提取的不止11 12行呢?
如果我想 提取第11行 和12行 数据相加 求和
提取第23行 和24行 数据相加 求和
提取第35行 和36行 数据相加 求和
....
....
....
.....
提取第83行 和84行 数据相加 求和
怎么弄~~~~
作者: tmplinshi 时间: 2010-12-23 15:30
- @echo off
- set List=11 23 35 83
- SetLocal EnableDelayedExpansion
- for %%a in (%List%) do set Var%%a=0
- for /f "delims=: tokens=2" %%a in (myfile.txt) do (
- set /a Line += 1
- if defined LastLine (
- set /a #!LastLine!_!Line! = Var!LastLine! + Line
- set LastLine=
- )
- if defined Var!Line! set /a LastLine = Line, Var!Line! = %%a
- )
- set #
- pause
复制代码
作者: pdp320921 时间: 2010-12-23 20:22
4楼没清楚的我意图
我的意思是提取某个文件中的 11行数据+12行数据 求和
以后每隔12行提取数据 如 23行数据+24行数据 求和
以此类推 直到 提取到 83行数据+84行数据 求和
==>等待高手指点~~~~~
作者: hanyeguxing 时间: 2010-12-23 21:03
ANSI编码;空行也算在行号内:- @echo off&setlocal enabledelayedexpansion
- set a=11
- for /f "tokens=1-3* delims=:" %%a in ('findstr /n .* myfile.txt') do if %%a==!a! (
- if "!b!"=="1" (set/a b=11,c+=%%c&echo !c!) else set/a b=1,c=%%c
- set/a a+=b
- )
- pause
复制代码
如果文本行数远多于84,而只提取前84行,则:- @echo off&setlocal enabledelayedexpansion
- set a=11
- for /f "tokens=1-3* delims=:" %%a in ('findstr /n .* myfile.txt') do (
- if %%a==!a! (
- if "!b!"=="1" (set/a b=11,c+=%%c&echo !c!) else set/a b=1,c=%%c
- set/a a+=b
- )
- if %%a==84 goto:end
- )
- :end
- pause
复制代码
如果要忽略空行以及;开头的行,则- @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&echo !c!) else set/a b=1,c=%%a
- set/a a+=b
- )
- if !n!==84 goto:end
- )
- :end
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-12-23 21:24 编辑 ]
作者: tmplinshi 时间: 2010-12-23 21:57
- @echo off
- SetLocal EnableDelayedExpansion
- set /a Start = 11, End = 83, Start -= 1, End -= Start
- for /f "skip=%Start% delims=: tokens=2" %%a in (myfile.txt) do (
- set /a n += 1, var += %%a, End -= 1
- if !n!==12 set /a n = 0, var = 0
- if !n!==2 (
- echo !var!
- if !End! lss 0 goto Finish
- )
- )
-
- :Finish
- 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,然后分隔加点.,(保留三位小数)- @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
复制代码
如果装有Windows PowerShell,可以直接调用Windows PowerShell运算。- @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 b=11
- PowerShell ^(%%a+!c!^)/1000
- ) else set/a b=1,c=%%a
- set/a a+=b
- )
- if !n!==84 goto:end
- )
- :end
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-12-24 20:52 编辑 ]
作者: pdp320921 时间: 2010-12-24 19:34
我之前的想法跟12楼一样,但是“在批处理中,要想除1000并得到小数的话,可以对数字前补0,然后分隔加点.,(保留三位小数)”感觉是否已经偏离小数的本质,这样显示出来的数据还能进行其他算术运算?
作者: tmplinshi 时间: 2010-12-24 21:28
补 0 的方法很好- @echo off
- SetLocal EnableDelayedExpansion
- set /a Start = 11, End = 83, Start -= 1, End -= Start, var = 1000
- for /f "skip=%Start% delims=: tokens=2" %%a in (myfile.txt) do (
- set /a n += 1, var += %%a, End -= 1
- if !n!==12 set /a n = 0, var = 1000
- if !n!==2 (
- echo 0.!var:~-3!
- if !End! lss 0 goto Finish
- )
- )
-
- :Finish
- 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 |