标题: [文本处理] 【已解决】批处理:统计数值间隔多少次未出现 [打印本页]
作者: 思想之翼 时间: 2013-2-28 10:39 标题: 【已解决】批处理:统计数值间隔多少次未出现
本帖最后由 思想之翼 于 2013-3-7 08:43 编辑
批处理:统计数值间隔多少次未出现
有一txt文本,数值记录格式为
0000001 1 0 ......
0000002 2 1 ......
0000003 1 1 ......
0000004 1 0 ......
0000005 2 2 ......
0000006 11 5 ......
0000007 11 0 ......
......
0000001......为时序,第一列1 、2 、1 、1 、2 、11 、11......为记录数值,这样的记录数值共有252列。欲统计各列每行数值间隔多少次未出现。
比如第一列记录数值中,
序号0000001的数值为1
序号0000002的数值为2----上一时序数值为1,未出现该时序的数值2,记为该时序的数值2未出现1次
序号0000003的数值为1----上一时序数值为2,未出现该时序的数值1,再上一时序数值为1,出现该时序的数值1,记为该时序的数值1未出现1次
序号0000004的数值为1----上一时序数值为1,出现该时序的数值1,记为该时序的数值1未出现0次
序号0000005的数值为2----上两个时序数值为1,未出该时序的现数值2,再上一时序数值为2,出现该时序的数值2,记为该时序的数值2未出现2次
序号0000006的数值为11----上五个时序数值分别为1、2、1、1、2,未出现该时序的数值11,记为该时序的数值11未出现5次
序号0000007的数值为11----上一时序数值为11,出现该时序的数值11,记为该时序的数值11未出现0次
......
上述统计的未出现次数,就是需要的结果。第二列至以后的252列同理统计。统计数值写入一新建txt文本,数值格式为:序号+空格+第一列数值未出现次数+空格+第二列数值未出现次数......+空格+第252列数值未出现次数
恳望大师帮助!
作者: CrLf 时间: 2013-2-28 15:12
本帖最后由 CrLf 于 2013-3-1 14:36 编辑
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1*" %%a in (a.txt) do (
- set "str=%%a"
- for %%c in (%%b) do (
- if !$%%c! gtr 0 (set "str=!str! !$%%c!"&set $%%c=0) else set "str=!str! 0"
- )
- for /l %%c in (0 1 9) do set /a $%%c+=1
- echo !str!
- ))>b.txt
复制代码
作者: 思想之翼 时间: 2013-3-1 09:01
回复 2# CrLf
代码有误。上附件。 未出现,即遗漏。b列数值的遗漏,应是像d列的数值,论坛巡查您给出的代码,不知道哪里错了,恳望帮我看看。
作者: CrLf 时间: 2013-3-1 14:37
回复 3# 思想之翼
最好贴样本节选附件,比较有参考价值
作者: 思想之翼 时间: 2013-3-1 15:04
回复 4# CrLf
好的。放上测试样本:a.txt是原数据,b-1.txt是批处理结果,b-2是想要得到的结果。烦请大师看看错在哪里!
作者: apang 时间: 2013-3-3 20:15
本帖最后由 apang 于 2013-3-4 11:17 编辑
- Set FSO = CreateObject("Scripting.FileSystemObject")
- Set File = FSO.OpenTextFile("a.txt")
- T = Time
- Do Until File.atEndOfStream
- Text = File.ReadLine
- If RegEx <> "" Then '排除空行
- A = Split(RegEx," ")
- m = UBound(A) 'm=列数
- ReDim PreServe B(m,n) '申明数组B
- For i = 0 to m :B(i,n) = A(i) :Next '数组B赋值
- n = n + 1 'n=行数
- End If
- Loop
-
- n = n - 1
- ReDim C(m,n) '申明数组C
- For i = 1 to m 'm=列数
- For j = 0 to n 'n=行数
- Num = 0
- For k = j - 1 to 0 step -1
- If B(i,j) = B(i,k) Then Exit For '相等则退出循环
- Num = Num + 1 '不相等则自加1
- Next
- C(i,j) = Num '数组C赋值
- Next
- Next
-
- For i = 0 to n '写入文件
- Str = ""
- For j = 1 to m :Str = Str & vbTab & C(j,i) :Next
- FSO.OpenTextFile("b.txt",8,true).WriteLine B(0,i) & Str
- Next
- MsgBox T & vbLf & Time
-
- Function RegEx()
- Set Re = New RegExp
- Re.Pattern = "\s+"
- Re.Global = True
- RegEx = Trim(Re.Replace(Text," "))
- End Function
复制代码
套用另外一个帖子的代码,思路一样,试一下看
作者: 思想之翼 时间: 2013-4-8 03:46
回复 6# apang
谢谢您的大力帮助!代码运行流畅。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |