[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】如何用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,
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

把你两组数据合在一起如下:
  1. 12 14 3
  2. 23 24 3
  3. 15 15 5
  4. 17 17 1
  5. 12 12 3
  6. 00 24 4
  7. 15 15 3
  8. 12 12 4
  9. 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
还有没其他情况?
楼主就这个例子,把需要得到的结果贴上来看看。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 思想之翼 于 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代码应该修改哪些地方?

TOP

回复 3# 思想之翼
看清楚疑问3
这两种情况代码可以合在一起写的。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 思想之翼 于 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

TOP

回复 2# xxpinqz


    有没其他情况?
-------
还有一种情况,统计的数据如果扩展到三位数,即
123
456
789
123
123
123
此时偏差值:123-123+123-123+123-789+123

如果统计的数据需要扩展到1-n位数,bat代码也能够适用,就太好了。

TOP

两位数的,试试?
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. For i = 1 to 100
  3.     Set file = fso.OpenTextFile(i & ".txt", 1)
  4.     ReDim arRow(0) : str = ""
  5.     while Not file.AtEndOfStream
  6.         strLine = RegEx(file.ReadLine)
  7.         If strLine <> "" Then
  8.             arLine = Split(strLine, " ")
  9.             ReDim Preserve arRow(UBound(arLine))
  10.             For j = 0 to UBound(arLine)
  11.                 arRow(j) = arRow(j) & " " & arLine(j)
  12.             Next
  13.         End If
  14.     wend
  15.     For j = 0 to UBound(arRow)
  16.         str = str & " " & GetNum(arRow(j))
  17.     Next
  18.     fso.OpenTextFile("New" & i & ".txt", 2, true).Write Mid(str,2)
  19. Next
  20. MsgBox "OK"
  21. Function RegEx(strLine)
  22.     Set re = New RegExp
  23.     re.Global = true
  24.     re.Pattern = "\s+"
  25.     RegEx = Trim(re.Replace(strLine," "))
  26. End Function
  27. Function GetNum(s)
  28.     ar = Split(s, " ")
  29.     Set re = New RegExp
  30.     re.Global = true
  31.     re.Pattern = "(\d{2}) " & ar(1)
  32.     For Each m in re.Execute(s)
  33.         Num = Num + ar(1) - m.SubMatches(0)
  34.     Next
  35.     Num = Num + ar(1)
  36.     If Num < 0 Then
  37.         GetNum = Right("00" & (100 - Right("00" & Abs(Num), 2)), 2)
  38.     Else GetNum = Right("00" & Num, 2)
  39.     End If
  40. End Function
复制代码
1

评分人数

TOP

小改一下,1-n位,试试
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. For i = 1 to 10
  3.     Set file = fso.OpenTextFile(i & ".txt", 1)
  4.     ReDim arRow(0) : str = ""
  5.     while Not file.AtEndOfStream
  6.         strLine = RegEx(file.ReadLine)
  7.         If strLine <> "" Then
  8.             arLine = Split(strLine, " ")
  9.             ReDim Preserve arRow(UBound(arLine))
  10.             For j = 0 to UBound(arLine)
  11.                 arRow(j) = arRow(j) & " " & arLine(j)
  12.             Next
  13.         End If
  14.     wend
  15.     For j = 0 to UBound(arRow)
  16.         str = str & " " & GetNum(arRow(j))
  17.     Next
  18.     fso.OpenTextFile("New" & i & ".txt", 2, true).Write Mid(str, 2)
  19. Next
  20. MsgBox "OK"
  21. Function RegEx(strLine)
  22.     Set re = New RegExp
  23.     re.Global = true
  24.     re.Pattern = "\s+"
  25.     RegEx = Trim(re.Replace(strLine," "))
  26. End Function
  27. Function GetNum(s)
  28.     ar = Split(s, " ")
  29.     n = Len(ar(1)) : x = String(n,"0") ''n为数值位数,x为补零个数
  30.     Set re = New RegExp
  31.     re.Global = true
  32.     re.Pattern = "(\d{" & n & "}) " & ar(1)
  33.     For Each m in re.Execute(s)
  34.         Num = Num + ar(1) - m.SubMatches(0)
  35.     Next
  36.     Num = Num + ar(1)
  37.     If Num < 0 Then
  38.         GetNum = Right(x & (10^n - Right(x & Abs(Num), n)), n)
  39.     Else GetNum = Right(x & Num, n)
  40.     End If
  41. End Function
复制代码
1

评分人数

TOP

返回列表