标题: [文本处理] 【已解决】如何用BAT批量统计数据变化偏差值 [打印本页]
作者: 思想之翼 时间: 2014-4-5 14:04 标题: 【已解决】如何用BAT批量统计数据变化偏差值
本帖最后由 思想之翼 于 2014-4-5 22:08 编辑
问题1
逐日记录某地气候温湿度数据的txt文本有100个,分别命名为1.txt 2.txt 3.txt ...100.txt,每个文本格式相同,内有420列数据,比如1.txt文本的格式如下:
12 13 14 ... 19
23 23 24 ... 23
15 15 15 ... 15
17 01 17 ... 19
12 13 12 ... 12
00 24 24 ... 24
15 13 15 ... 19
12 14 12 ... 12
14 14 14 ... 14
现在欲用BAT批量统计这100个文本的数据变化偏差值,具体统计步骤如下:
1、以1.txt举例
先看1.txt的第1列,其第1行数值是12,那么从上至下分别找出该列所有的数值12、以及数值12的上一行数值,即:
12
17
12
15
12
然后统计数据变化偏差值:偏差值=(12-15)+(12-17)+12
若偏差值>0,则取偏差值的百位与个位(比如:偏差值=4,则取04;偏差值=215,则取15)
若偏差值<0,则取100+(偏差值的百位与个位)(比如:偏差值=-4,则100-04=96,取96;偏差值=-215,则100-15=85,取85)
举例的1.txt文本的第2列--第420列,同理统计其数据变化偏差值。
将上述统计出的偏差值,写入新建的new1.txt,格式如下:
04 85 96 01 00...54
2、同理统计2.txt 3.txt ... 100.txt 文本内的气候温湿度偏差值,将统计结果写入新建的new2.txt new3.txt ... new100.txt
此轮统计结束。
这样的统计过程,该如何用BAT来实现?恳望得到帮助!
问题2
上述统计流程,在实际工作中还需要扩展运用于不同的数据统计:
比如:上例100个txt文本数据为2位数,偏差值数据也是取2位数;如果这100个txt文本的数据是1位数,偏差值数据也相应取1位数。那么,上述BAT代码如何修改,就能够扩展运用?
举例2:
1.txt数据格式为:
2 3 4 ... 9
3 3 4 ... 3
5 5 5 ... 5
7 1 7 ... 9
2 3 2 ... 2
0 4 4 ... 4
5 3 5 ... 9
2 4 2 ... 2
4 4 4 ... 4
上述统计方式与流程均不改变,变化的只是偏差值取值:
若偏差值>0,则取偏差值的个位(比如:偏差值=4,则取4;偏差值=215,则取5)
若偏差值<0,则取10+(偏差值的个位)(比如:偏差值=-4,则10-4=6,取6;偏差值=-215,则10-5=5,
作者: xxpinqz 时间: 2014-4-5 16:00
把你两组数据合在一起如下:- 12 14 3
- 23 24 3
- 15 15 5
- 17 17 1
- 12 12 3
- 00 24 4
- 15 15 3
- 12 12 4
- 14 14 4
复制代码
计算偏差就上面例子就有3种情况了
1、按你举例的样子,如第一列得到差值12-15+12-17+12=4
2、2列差值是14-12+14=16
3、3列差值是3-4+3-1+3-3=1
还是 3-4+3-1+3-3+3=4
还有没其他情况?
楼主就这个例子,把需要得到的结果贴上来看看。
作者: 思想之翼 时间: 2014-4-5 17:15
本帖最后由 思想之翼 于 2014-4-5 17:34 编辑
回复 2# xxpinqz
感谢您的关注!
例中(问题一:两位数的统计):
第1列得到差值12-15+12-17+12=4
第2列得到差值13-24+13-01+13=14
第3列得到差值14-12+14=16
最后列得到差值19-24+19-15+19=18
问题二中的1位数的数据,不是和问题一的2位数的数据合并。两者是各自独立的统计过程。
提出问题二,意在求教:当问题一的统计BAT代码写好后,如果需要扩展运用于问题二的数据统计时,解决问题一的BAT代码应该修改哪些地方?
作者: xxpinqz 时间: 2014-4-5 17:37
回复 3# 思想之翼
看清楚疑问3
这两种情况代码可以合在一起写的。
作者: 思想之翼 时间: 2014-4-5 17:39
本帖最后由 思想之翼 于 2014-4-5 17:41 编辑
回复 2# xxpinqz
是我没有看明白疑问3!
3列差值是3-4+3-1+3-3=1
还是 3-4+3-1+3-3+3=4
------------
应该是3-4+3-1+3-3+3=4
作者: 思想之翼 时间: 2014-4-5 17:55
回复 2# xxpinqz
有没其他情况?
-------
还有一种情况,统计的数据如果扩展到三位数,即
123
456
789
123
123
123
此时偏差值:123-123+123-123+123-789+123
如果统计的数据需要扩展到1-n位数,bat代码也能够适用,就太好了。
作者: apang 时间: 2014-4-5 18:14
两位数的,试试?- Set fso = CreateObject("Scripting.FileSystemObject")
- For i = 1 to 100
- Set file = fso.OpenTextFile(i & ".txt", 1)
- ReDim arRow(0) : str = ""
- while Not file.AtEndOfStream
- strLine = RegEx(file.ReadLine)
- If strLine <> "" Then
- arLine = Split(strLine, " ")
- ReDim Preserve arRow(UBound(arLine))
- For j = 0 to UBound(arLine)
- arRow(j) = arRow(j) & " " & arLine(j)
- Next
- End If
- wend
- For j = 0 to UBound(arRow)
- str = str & " " & GetNum(arRow(j))
- Next
- fso.OpenTextFile("New" & i & ".txt", 2, true).Write Mid(str,2)
- Next
-
- MsgBox "OK"
-
- Function RegEx(strLine)
- Set re = New RegExp
- re.Global = true
- re.Pattern = "\s+"
- RegEx = Trim(re.Replace(strLine," "))
- End Function
-
- Function GetNum(s)
- ar = Split(s, " ")
- Set re = New RegExp
- re.Global = true
- re.Pattern = "(\d{2}) " & ar(1)
- For Each m in re.Execute(s)
- Num = Num + ar(1) - m.SubMatches(0)
- Next
- Num = Num + ar(1)
- If Num < 0 Then
- GetNum = Right("00" & (100 - Right("00" & Abs(Num), 2)), 2)
- Else GetNum = Right("00" & Num, 2)
- End If
- End Function
复制代码
作者: apang 时间: 2014-4-5 22:24
小改一下,1-n位,试试- Set fso = CreateObject("Scripting.FileSystemObject")
- For i = 1 to 10
- Set file = fso.OpenTextFile(i & ".txt", 1)
- ReDim arRow(0) : str = ""
- while Not file.AtEndOfStream
- strLine = RegEx(file.ReadLine)
- If strLine <> "" Then
- arLine = Split(strLine, " ")
- ReDim Preserve arRow(UBound(arLine))
- For j = 0 to UBound(arLine)
- arRow(j) = arRow(j) & " " & arLine(j)
- Next
- End If
- wend
- For j = 0 to UBound(arRow)
- str = str & " " & GetNum(arRow(j))
- Next
- fso.OpenTextFile("New" & i & ".txt", 2, true).Write Mid(str, 2)
- Next
-
- MsgBox "OK"
-
- Function RegEx(strLine)
- Set re = New RegExp
- re.Global = true
- re.Pattern = "\s+"
- RegEx = Trim(re.Replace(strLine," "))
- End Function
-
- Function GetNum(s)
- ar = Split(s, " ")
- n = Len(ar(1)) : x = String(n,"0") ''n为数值位数,x为补零个数
- Set re = New RegExp
- re.Global = true
- re.Pattern = "(\d{" & n & "}) " & ar(1)
- For Each m in re.Execute(s)
- Num = Num + ar(1) - m.SubMatches(0)
- Next
- Num = Num + ar(1)
- If Num < 0 Then
- GetNum = Right(x & (10^n - Right(x & Abs(Num), n)), n)
- Else GetNum = Right(x & Num, n)
- End If
- End Function
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |