找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24416|回复: 6

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

[复制链接]
发表于 2013-2-28 10:39:23 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 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列数值未出现次数

恳望大师帮助!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-2-28 15:12:08 | 显示全部楼层
本帖最后由 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:59 | 显示全部楼层
回复 2# CrLf


  代码有误。上附件。  未出现,即遗漏。b列数值的遗漏,应是像d列的数值,论坛巡查您给出的代码,不知道哪里错了,恳望帮我看看。
发表于 2013-3-1 14:37:26 | 显示全部楼层
回复 3# 思想之翼


    最好贴样本节选附件,比较有参考价值
 楼主| 发表于 2013-3-1 15:04:59 | 显示全部楼层
回复 4# CrLf


    好的。放上测试样本:a.txt是原数据,b-1.txt是批处理结果,b-2是想要得到的结果。烦请大师看看错在哪里!
发表于 2013-3-3 20:15:37 | 显示全部楼层
本帖最后由 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:43 | 显示全部楼层
回复 6# apang


    谢谢您的大力帮助!代码运行流畅。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 04:33 , Processed in 0.019661 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表