Board logo

标题: [文本处理] [已解决]批处理怎样统计下记事本中运动员连续比赛,就是统计相同数? [打印本页]

作者: qlewa    时间: 2013-1-24 17:37     标题: [已解决]批处理怎样统计下记事本中运动员连续比赛,就是统计相同数?

本帖最后由 qlewa 于 2013-1-30 17:57 编辑

主要本题就是统计运动员在最新的两组运动中是否连有续参加了前三项运动!
运动员编号 有 01 02 03 04 05 06 07 08 09 10 11 12  现在暂时只是这12参赛运动员号
每一行为一个比赛时间段  ;每次时间段有 五个项目(ABCDE)同时!
每次统计会自动添加到记事本中(CSJL.txt)!(这个不需要做,已经有了,半小时自动更新的)


如参赛记录记事本(CSJL.txt)中记录:(统计中运动员号之间都是一个空格号相隔的)
A   B   C   D   E
.......
02 03 08 11 06
07 02 06 10 05
09 07 08 01 03


现在要做 就是:
统计记事本(CSJL.txt)中最后两行的中前三项目(ABC)是否有相同数!
这里就是07 为相同数
当发现相同数则进行X方案,并把这个相同数添加到连续参赛记事本“LXCS.txt”中,一次一行!
(要在最后注明添加时间,格式为: 07  Time:15:29      ;当然有时会出现同三个号都出现的情况,如格式为: 01 02 03  Time: 16:16  )

如没有相同数就继续检测,时间为半个小时检测一次!
作者: BAT-VBS    时间: 2013-1-24 20:48

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%a in ('type CSJL.txt ^| find /c /v ""') do (
  4.     set "RowNum=%%a"
  5. )
  6. set /a RowNum-=2
  7. set skip=skip=%RowNum%
  8. set "str="
  9. for /f "%skip% tokens=1-3" %%a in (CSJL.txt) do (
  10.     if not defined %%a (
  11.         set "%%a=1"
  12.     ) else (
  13.         set "str=!str! %%a"
  14.     )
  15.     if not defined %%b (
  16.         set "%%b=1"
  17.     ) else (
  18.         set "str=!str! %%b"
  19.     )
  20.     if not defined %%c (
  21.         set "%%c=1"
  22.     ) else (
  23.         set "str=!str! %%c"
  24.     )
  25. )
  26. set now=%time:~0,5%
  27. >>LXCS.txt echo !str! Time:%now%
复制代码
半个小时检测一次放到任务计划里面比较好
作者: batman    时间: 2013-1-24 21:14

本帖最后由 batman 于 2013-1-24 21:37 编辑

利用WMI事件监控来完成:
  1. Dim objFSO
  2. Set objFSO = CreateObject("Scripting.FileSystemObject")
  3. Dim objWMI, objEvents, objEvent
  4. Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
  5. Dim File, CFile, LogFile
  6. '如没有与VBS在同一目录下请填写完整路径,并将路径中的\写成\\,如c:\\test\\csjl.txt
  7. File = "CSJL.txt"
  8. CFile = Replace(File, "\\", "\")
  9. '如没有与VBS在同一目录下请填写完整路径
  10. LogFile = "LXCS.txt"
  11. objFSO.OpenTextFile(LogFile, 2, True).WriteLine "连赛记录:"
  12. '设置WMI文件修改事件监控,这里是每60秒监控一次
  13. Set objEvents = objWMI.ExecNotifiCationQuery _
  14.   ("Select * From __InstanceOperationEvent Within 60 " _
  15.     & "Where TargetInstance Isa 'CIM_DataFile' And " _
  16.       & "TargetInstance.Name='" & File & "'")
  17. Do While True
  18.   Set objEvent = objEvents.NextEvent()
  19.   If objEvent.Path_.Class = "__InstanceModificationEvent" Then
  20.     Juge
  21.     If Juge <> "" Then _
  22.       objFSO.OpenTextFile(LogFile, 8, True).WriteLine Juge & " Date_Time:" & Now()
  23.   End If
  24. Loop
  25. Function Juge()
  26.   '重复参赛判断函数
  27.   Dim objStr, Arr, Arr1, Str
  28.   objStr = objFSO.OpenTextFile(CFile).ReadAll()
  29.   Arr = Split(objStr, vbCrLf)
  30.   For i = UBound(Arr) - 1 To UBound(Arr)
  31.     Arr1 = Split(Arr(i), " ")
  32.     For j = 0 To 2
  33.       If InStr(Str, Arr1(j)) = 0 Then
  34.         Str = Str & Arr1(j) & " "
  35.         Else
  36.         Juge = Juge & Arr1(j) & " "
  37.       End If
  38.     Next
  39.   Next
  40. End Function
复制代码

作者: qlewa    时间: 2013-1-25 19:51

谢谢两位的回答,十分感谢!

回复 2# BAT-VBS


    你好、你的代码很好,
但有个问题:1. 没有时相同数,也添加时间记录!希望可以不统计这个,或者添加一个“无”! 如 “无连赛 Time: 19:20 ”
                 2. 同一行前三有相同数也统计!希望可以忽略掉,或者在这个数上加一个符号'CF',如同行‘07’出现两次则   如: “ CF07   Time :19:20' ”


十分感谢!
作者: qlewa    时间: 2013-1-25 19:53

回复 3# batman

很感谢版主,但是不知道为什么运行不起来,只在LXCS.txt中记录“连赛记录:”,其他什么也没有了!
作者: terse    时间: 2013-1-25 21:00

本帖最后由 terse 于 2013-1-26 23:16 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in ('find /c /v "" ^<CSJL.txt') do set/a i=%%i-3
  3. if !i! gtr 0 (
  4.    for /f "skip=%i% tokens=1-3" %%a in (CSJL.txt) do (
  5.        if defined str (
  6.           for %%i in (!str!) do set _%%i=i
  7.           for %%i in (%%a %%b %%c) do if defined _%%i set var=!var! %%i
  8.       )
  9.           set str=%%a %%b %%c
  10.    )
  11. )
  12. if defined var for /f "tokens=1-3" %%i in ('time /t') do >>LXCS.txt echo!var! Time:%%i
  13. pause
复制代码

作者: qlewa    时间: 2013-1-26 20:35

本帖最后由 qlewa 于 2013-1-26 21:44 编辑

回复 6# terse

非常谢谢,很好用!

请帮我在后面在加一种情况:

就是最后三行的前三位都有同样的号出现时,再把这个号添加到 DCLS.txt

先谢谢了!
作者: terse    时间: 2013-1-26 23:17

回复 7# qlewa
已修改
作者: qlewa    时间: 2013-1-28 11:36

本帖最后由 qlewa 于 2013-1-29 15:52 编辑

回复 8# terse


你好,可能是我没有说清楚,不好意思,请再帮下忙!

就是最后三行的前三位,有三行都出现过的数字统计出来! 请避免单行出现三个相同数,也被统计出来的问题!

谢谢!
作者: terse    时间: 2013-1-28 13:42

本帖最后由 terse 于 2013-1-30 12:58 编辑

回复 9# qlewa
没有好的方案前 就这样了
再次修正;尽量较少的使用计算以提高代码效率
还需楼主验证代码的通用性
  1. @echo off&setlocal enabledelayedexpansion
  2. set L=3
  3. for /f %%i in ('find /c /v "" ^<CSJL.txt') do set/a i=%%i-L
  4. if !i! gtr 0 (
  5.    for /f "skip=%i% tokens=1-3" %%a in (CSJL.txt) do (
  6.        set "var="
  7.        if defined str (
  8.           for %%i in (!str!) do set _%%i=i
  9.           for %%i in (%%a %%b %%c) do (
  10.               if defined _%%i set var=!var! %%i
  11.               set "_%%i="
  12.           )
  13.               for %%i in (!str!) do set _%%i=
  14.               set i=&set str=!var!
  15.        ) else if defined i set str=%%a %%b %%c
  16.    )
  17.          if defined var >>LXCS.txt echo!var! Time:%time:~,5%
  18. )
  19. pause
复制代码

作者: terse    时间: 2013-1-29 23:20

本帖最后由 terse 于 2013-1-30 00:05 编辑

回复 9# qlewa
上面已修正
再发一个
  1. @echo off&setlocal enabledelayedexpansion
  2. set L=3
  3. for /f %%i in ('find /c /v "" ^<CSJL.txt') do set/a i=%%i-L,L-=1
  4. if !i! gtr 0 (
  5.    for /f "skip=%i% tokens=1-3" %%a in (CSJL.txt) do (
  6.        for %%i in (%%a %%b %%c) do if defined _%%i set /a $%%i+=1&set "_%%i="
  7.        set str=%%a %%b %%c
  8.        for %%i in (!str!) do set _%%i=i
  9.    )
  10.        for %%i in (!str!) do (
  11.            if !$%%i! equ !L! (
  12.               if defined _%%i set var=!var! %%i&set "_%%i="
  13.            )
  14.        )
  15.        if defined var >>LXCS.txt echo!var! Time:%time:~,5%
  16. )
  17. pause
复制代码

作者: apang    时间: 2013-1-30 09:07

本帖最后由 apang 于 2013-1-30 09:13 编辑

我也来一个,不知能否满足要求
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-3" %%a in ('sort /+65536 CSJL.txt') do (
  3.   set /a n+=1,_%%a+=1,_%%b+=1,_%%c+=1
  4.   if !n! equ 3 (
  5.     for /f "tokens=1,2 delims==" %%i in ('set _') do (
  6.       if %%j==3 set "str=!str! %%i"
  7.     )
  8.     if "!str!" neq "" (
  9.       set "str=!str:_=!"
  10.       >>LXCS.txt echo,!str:~1! 时间:%time:~,5%
  11.     )
  12.     goto :eof
  13.   )
  14. )
复制代码

作者: qlewa    时间: 2013-1-30 17:37

回复 12# apang

谢谢,你的这个不能运行,直接退出,无其他反映和记录!




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