标题: [文本处理] 批处理如何将两个文本的指定列的数据进行数学运算 [打印本页]
作者: grwy1234 时间: 2008-12-16 17:55 标题: 批处理如何将两个文本的指定列的数据进行数学运算
本帖最后由 pcl_test 于 2016-8-13 13:40 编辑
首先感谢昨天帮忙的tireless
4个文本!把买减卖!要求第一第二列保留!第三列相减的批处理!文本内容如下:请大侠帮忙!
逐笔委买量中单14-17.txt;内容
SH600003 2008-12-16 1329797
SH600004 2008-12-16 3750900
SH600005 2008-12-16 28445485
SH600006 2008-12-16 2995070
SH600007 2008-12-16 193100
SH600008 2008-12-16 2530831
。。。。。。。。。
逐笔委卖量中单14-17.txt;内容
SH600003 2008-12-16 2722921
SH600004 2008-12-16 7211712
SH600005 2008-12-16 78318094
SH600006 2008-12-16 7065188
SH600007 2008-12-16 515461
SH600008 2008-12-16 6309013
。。。。。。
要求结果为:逐笔中单净量!
SH600003 2008-12-16 -1393124
SH600004 2008-12-16 -3460812
SH600005 2008-12-16 -49872609
SH600006 2008-12-16 -4070118
SH600007 2008-12-16 -322361
SH600008 2008-12-16 -3778182
也就是文本第一第二列不变文本第三列相减
[ 本帖最后由 grwy1234 于 2008-12-17 09:16 编辑 ]
作者: shqf 时间: 2008-12-16 20:52
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2,3 delims= " %%a in ('type 逐笔委买量大单18-19.txt') do (
- set %%a=%%c
- )
- for /f "tokens=1,2,3 delims= " %%a in ('type 逐笔委卖量大单18-19.txt') do (
- set /a jingliang=!%%a!-%%c
- >>逐笔大单净量.txt echo %%a %%b !jingliang!
- )
- echo OK
- pause>nul
复制代码
作者: grwy1234 时间: 2008-12-16 21:37
先感谢!算法是对了!可是三列之间少了!“ ”一个字符!请再帮我一下好吗?谢谢!双引号内的!
作者: grwy1234 时间: 2008-12-17 15:55
请各位大侠再帮帮我吧!
作者: shqf 时间: 2008-12-17 18:56
什么叫“分列符合”?你1楼中的目标文件格式不对吗?
作者: 随风 时间: 2008-12-17 19:02
貌似数字很大哦,如何单比或结果超出了cmd的最大处理数字可要注意了,(必须换种算法)否则错了都不知道。
-2147483648 set /a 能处理的最小数
2147483647 set /a 能处理的最大数
[ 本帖最后由 随风 于 2008-12-17 19:04 编辑 ]
作者: grwy1234 时间: 2008-12-17 22:52 标题: 回复 6楼 的帖子
谢谢版主!能不能提供更强大的算法?
作者: Batcher 时间: 2008-12-17 23:39 标题: 回复 7楼 的帖子
大数计算可以调用VBS
作者: qlcom 时间: 2008-12-18 02:52
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2,3 delims= " %%i in (逐笔委买量大单18-19.txt) do (
- set/a n+=1
- for /f "tokens=3 delims= " %%a in (逐笔委卖量大单18-19.txt) do (
- set/a m+=1
- if !n!==!m! (
- set/a mar=%%k-%%a
- echo %%i %%j !mar!>>逐笔大单净量.txt
- )
- )
- set "m="
- )
- start 逐笔大单净量.txt
复制代码
for嵌套效率就是很低! 不知道p处理有没有语句可以完成功能:符合某一条件就立即跳出本次内层循环,然后继续下次外部循环.
[ 本帖最后由 qlcom 于 2008-12-18 03:00 编辑 ]
作者: tireless 时间: 2008-12-18 12:11
- @echo off & setlocal EnableDelayedExpansion
- for %%A in (14-17 18-19) do (
-
- for %%B in (逐笔委卖量?单%%A.txt) do (
- set "净=%%~nB" & set "净=!净:委卖量=!净量.txt
- for /f "tokens=1-3" %%a in (%%B) do (
- >>%%Atmp.txt echo %%a %%b %%c -
- )
- )
-
- for /f "tokens=1-4" %%1 in ('^(type 逐笔委买量*%%A.txt^&type %%Atmp.txt^)^|sort') do (
- set /a %%1+=%%4%%3
- if "%%4"=="-" (
- >>!净! echo %%1 %%2 !%%1!
- set "%%1="
- )
- )
-
- del %%Atmp.txt
- )
复制代码
有点乱...思路是:
1. 在 卖量14-17.txt 的每行后面加 [空格]-,并输出至 14-17tmp.txt
2. 同时打印(type) 14-17tmp.txt 和 买量14-17.txt,再进行排序(sort.exe)。
排序成这样:
SH600003 2008-12-16 918049
SH600003 2008-12-16 2520921 -
SH600004 2008-12-16 3412596
SH600004 2008-12-16 6826841 -
......
然后直接计算:set /a %%1+=%%4%%3
当 %%4 等于 - 时,就将结果输出。
[ 本帖最后由 tireless 于 2008-12-18 20:46 编辑 ]
作者: 随风 时间: 2008-12-18 20:06 标题: 回复 9楼 的帖子
for嵌套效率就是很低! 不知道p处理有没有语句可以完成功能:符合某一条件就立即跳出本次内层循环,然后继续下次外部循环.
不能说 for嵌套效率就是很低 这只能说明你的代码设计有问题。
符合某一条件就立即跳出本次内层循环,然后继续下次外部循环
完全可以做到,用call 即可。
作者: pcl_test 时间: 2016-8-13 14:06
第三方- gawk "NR==FNR{a[$1$2]=$3;next}{print $1,$2,a[$1$2]-$3}" "买.txt" "卖.txt">"净.txt"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |