Board logo

标题: [文本处理] 【已解决】批处理:统计数值间隔多少次未出现 [打印本页]

作者: 思想之翼    时间: 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 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1*" %%a in (a.txt) do (
  3.    set "str=%%a"
  4.    for %%c in (%%b) do (
  5.       if !$%%c! gtr 0 (set "str=!str! !$%%c!"&set $%%c=0) else set "str=!str! 0"
  6.    )
  7.    for /l %%c in (0 1 9) do set /a $%%c+=1
  8.    echo !str!
  9. ))>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 编辑
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set File = FSO.OpenTextFile("a.txt")
  3. T = Time
  4. Do Until File.atEndOfStream
  5.    Text = File.ReadLine
  6.    If RegEx <> "" Then      '排除空行
  7.       A = Split(RegEx," ")
  8.       m = UBound(A)         'm=列数
  9.       ReDim PreServe B(m,n) '申明数组B
  10.       For i = 0 to m :B(i,n) = A(i) :Next '数组B赋值
  11.       n = n + 1  'n=行数
  12.    End If
  13. Loop
  14. n = n - 1
  15. ReDim C(m,n)    '申明数组C
  16. For i = 1 to m  'm=列数
  17.    For j = 0 to n  'n=行数
  18.       Num = 0
  19.       For k = j - 1 to 0 step -1
  20.          If B(i,j) = B(i,k) Then Exit For '相等则退出循环
  21.          Num = Num + 1  '不相等则自加1
  22.       Next
  23.       C(i,j) = Num  '数组C赋值
  24.    Next
  25. Next
  26. For i = 0 to n '写入文件
  27.    Str = ""
  28.    For j = 1 to m :Str = Str & vbTab & C(j,i) :Next
  29.    FSO.OpenTextFile("b.txt",8,true).WriteLine B(0,i) & Str
  30. Next
  31. MsgBox T & vbLf & Time
  32. Function RegEx()
  33.    Set Re = New RegExp
  34.    Re.Pattern = "\s+"
  35.    Re.Global = True
  36.    RegEx = Trim(Re.Replace(Text," "))
  37. End Function
复制代码
套用另外一个帖子的代码,思路一样,试一下看
作者: 思想之翼    时间: 2013-4-8 03:46

回复 6# apang


    谢谢您的大力帮助!代码运行流畅。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2