Board logo

标题: 请教加减运算! [打印本页]

作者: 3391617     时间: 2008-10-25 16:02    标题: 请教加减运算!

假设a.txt有如下内容:

13.611,2.636
19.853,5.102
23.998,5.282
28.310,4.296
37.505,3.145
...
...

想实现:"下一行开头减上一行开头,下一行末尾减上一行末尾"
即得到结果6.242,2.466>>b.txt
...
依次类推计算至末尾。。。

最终b.txt结果为:

6.242,2.466
4.145,0.18
....

请高手指点下如何能实现
研究好久也没弄出来
先谢过了~~

[ Last edited by 3391617 on 2008-10-25 at 16:08 ]
作者: tireless     时间: 2008-10-25 16:40
也就是两行两行计算?是这样吗:

a.txt中的第2行减第1行的结果>>b.txt
a.txt中的第4行减第3行的结果>>b.txt
作者: leonlau     时间: 2008-10-25 16:43
......
附件 1: 截图.jpg (2008-10-25 16:43, 60.67 K,下载次数: 2)



作者: 3391617     时间: 2008-10-25 16:52
2楼说的对,就是这个意思,“,”前后的数分别减上一行的!
第2行-第1行
第3行-第2行
第4行-第3行
...

[ Last edited by 3391617 on 2008-10-25 at 16:53 ]
作者: youkaib     时间: 2008-10-25 17:03
呵呵,我试了几下。我先告诉你,批处理不能对小数进行计算。
分隔符不能用逗号。

[ Last edited by youkaib on 2008-10-25 at 17:06 ]
作者: youkaib     时间: 2008-10-25 17:14
我给个思路。
@echo off
setlocal enabledelayedexpansion

for /l %%i in (1,1,20) do ( :::这里只是循环作用
call :b
echo !sum!
pause
)
:b
for /f %%a in (a.txt) do (
for /f "skip=1" %%b in (a.txt) do (
echo !!
set /a sum=!sum2!-!sum1!
)
)
goto :eof
这个是达不到你要求。

[ Last edited by youkaib on 2008-10-25 at 17:16 ]
作者: 3391617     时间: 2008-10-25 17:23
我测试一下看看
作者: 3391617     时间: 2008-10-25 17:46


  Quote:
Originally posted by youkaib at 2008-10-25 05:14 PM:
我给个思路。
@echo off
setlocal enabledelayedexpansion

for /l %%i in (1,1,20) do ( :::这里只是循环作用
call :b
echo !sum!
pause
)
:b
for /f %%a in (a.txt) do (
for /f &qu ...

提示:运算符不存在!!。。。
还有,这个没有把a.txt中“,”前后的数给分开运算啊

[ Last edited by 3391617 on 2008-10-25 at 17:48 ]
作者: terse     时间: 2008-10-25 18:04

@echo off&setlocal enabledelayedexpansion
echo.>b.txt
for /f %%i in (test.txt) do (
   if defined b (
      set A=%%i
      set A=!A:.=!
      set A=!A:,=!
      call:lp !a!)else (
      set B=%%i
      set B=!B:.=!
      set B=!B:,=!
))
start b.txt
exit
:lp
if !n! equ 3 (set T=.!T!)else (if !n! equ 4 (set T=,!T!)else if !n! equ 7 set T=.!T!)
set /a n+=1
if !A:~-1! geq !B:~-1! (
     set/a s=!A:~-1!-!B:~-1!
     set T=!s!!T!
     set A=!A:~,-1!&set B=!B:~,-1!
     if not defined B goto next
     goto lp
     )
     set/a s=1!A:~-1!-!B:~-1!
     set T=!s:~,1!!T!
     set A=!A:~,-1!&set B=!B:~,-1!
     set Ts=1!A:~-9!
     set/a Ts-=1
     set A=!A:~,-9!!Ts:~1!
     if defined B goto lp
:next
for /f "delims=0 tokens=*" %%i in ("!A!!T!") do set str=%%i
>>b.txt echo !str!
set "t="&set "b=%1"&set "n="
goto :eof

作者: 3391617     时间: 2008-10-25 18:16
TO:9楼
如果后一行的数比前一行的小,结果不正确。。。

你的代码好复杂。。。偶太菜。。。看不懂。。。
作者: terse     时间: 2008-10-25 18:40


  Quote:
Originally posted by 3391617 at 2008-10-25 18:16:
TO:9楼
如果后一行的数比前一行的小,结果不正确。。。

你的代码好复杂。。。偶太菜。。。看不懂。。。

如果后一行的数比前一行的小 你想怎么处理 得负数吗?还是大-小
作者: 3391617     时间: 2008-10-25 18:47
TO:11楼
得负数!

请问我给a、b附值错在哪里??
写了这两句:
set a="sed '%n%q;d' 1.txt"
set b="sed '%n%q;d' 2.txt"

[ Last edited by 3391617 on 2008-10-25 at 18:54 ]
作者: HAT     时间: 2008-10-25 18:50    标题: Re 12楼

批处理不允许这样赋值
可以把sed放在for里面再给a或者b赋值
作者: 3391617     时间: 2008-10-25 18:57
ECHO结果也不能用SET赋值吗?
谢谢BZ,还是有点迷糊
能说详细点么?
我再研究研究

[ Last edited by 3391617 on 2008-10-25 at 19:02 ]
作者: HAT     时间: 2008-10-25 19:02    标题: Re 14楼

echo也不能直接给变量赋值
建议多看教程

  Quote:
批处理的教学
http://www.cn-dos.net/forum/viewthread.php?tid=2338

批处理最完整人性化教程
http://www.cn-dos.net/forum/viewthread.php?tid=18482

批处理新手FAQ整理
http://www.cn-dos.net/forum/viewthread.php?tid=34049

中国DOS联盟批处理室经典帖子合集
http://www.cn-dos.net/forum/viewthread.php?tid=31551


作者: pusofalse     时间: 2008-10-25 21:33
初学AU3,用它给你写一个,思路跟BAT的相同。。。
if fileexists ("new.txt") then filedelete ("new.txt")
$file = Fileopen("a.txt",0)
dim $var1,$var2, $str[2], $num1, $num2,$enkey=@crlf,$numeric1, $numeric2

while 1
        $str = FilereadLine($file)
        if @error = -1 then exitloop
        $str = StringSplit ($str, ",")
        $num1 += 1
        $numeric1 +=1
        $num2 = $num1 - 1
        $numeric2 = $numeric1 - 1
        assign ($num1, $str[1])
        assign ("_" & $numeric1,$str[2])
        $s = eval ($num1)
        $d = eval ("_" & $numeric1)
        $a = eval ($num2)
        $e = eval ("_" & $numeric2)
        if $num1 > 1 then
           $var1 = $s - $a
           $var2 = $d - $e
           filewrite ("new.txt",$var1 &","&$var2 &$enkey)
        endif
wend

作者: youkaib     时间: 2008-10-26 12:46


  Quote:
Originally posted by 3391617 at 2008-10-25 17:23:
我测试一下看看

我不是说了你记事本存在小数的问题吗,你可以直接下cmd下写
set /a a=1.2-1.1
就会出现这个提示。
由于赋予变量会将整个a.txt的值赋予他,所以必须将他们隔开。
作者: 3391617     时间: 2008-10-26 18:01
有办法计算小数的
我翻过帖子
看到过
作者: shqf     时间: 2008-10-26 20:38
都是三位小数的话,可用如下程序:
@echo off&setlocal EnableDelayedExpansion
cd.>b.txt 2>nul
for /f "tokens=1,2 delims=," %%a in (a.txt) do (
if defined num1 (
set num3=%%a
set num4=%%b
set num3=!num3:.=!
set num4=!num4:.=!
set /a cha1=num3-num1
call :jiance !cha1!
set cha1=!cha!
set /a cha2=num4-num2
call :jiance !cha2!
set cha2=!cha!
set "cha1=!cha1:~0,-3!.!cha1:~-3,3!"
set "cha2=!cha2:~0,-3!.!cha2:~-3,3!"
echo !cha1!,!cha2!>>b.txt
)
set num1=%%a
set num2=%%b
set num1=!num1:.=!
set num2=!num2:.=!
)
echo OK.&pause
exit

:jiance
set cha=%1
if "%cha:~0,1%"=="-" (set fuhao=-&set cha=%cha:~1%) else (set fuhao=)
if %cha% lss 10 (set cha=%fuhao%000%cha%&goto :eof)
if %cha% lss 100 (set cha=%fuhao%00%cha%&goto :eof)
if %cha% lss 1000 (set cha=%fuhao%0%cha%&goto :eof)
set cha=%fuhao%%cha%
goto :eof
[ Last edited by shqf on 2008-10-26 at 20:44 ]
作者: 3391617     时间: 2008-10-26 22:16
TO:19楼
测试可以!
小数整数都没有限制的版本可以做到不呢?
我先研究研究你这个,谢谢各位的帮助了!不胜感激!
作者: HAT     时间: 2008-10-26 22:31    标题: Re 20楼

BAT调用VBS来计算吧