清理日志文件中的行

时间:2016-04-01 01:01:15

标签: vbscript

我有一个文件" D:\ test.log"它有两种风格之一。如果用户在收到消息时离线,则会显示此消息:

  

[02:19:47]兄弟Aimbot(adama900):(已于2016年3月31日星期五05:15:09保存)这是一个测试线

如果用户在收到消息时在线,则会出现这种情况:

  

[02:19:47] Aimbot弟兄(adama900):这是一个测试线

我想要做的就是剪掉多余的部分,如果它是第一种或第二种样式,它就会像这样:

  

兄弟Aimbot(adama900)这是一个测试线

然后将其放入消息框中。

这是我的代码:

Sub main()
  filename = "D:\Test.txt"
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile(filename)
  LNEVAL = f.ReadLine
  LNENUM = 0

  Do Until f.AtEndOfStream
    For i = 1 To LNENUMs
      f.ReadLine
    Next

    If InStr(LNEVAL, "(S") Then
      LNEVAL = Left(LNEVAL, (Len("(S")+4))
      MsgBox = LNEVAL
    End If
  Loop

  f.Close
End Sub

这是我到目前为止所做的。

1 个答案:

答案 0 :(得分:0)

使用regular expression替代品做你想做的事情相当简单。基本上你想要做的就是从每一行中删除三件事:

  • 字符串开头的方括号之间的子字符串
  • 冒号将名称与消息分开,
  • 冒号后括号之间的可选子字符串。

正则表达式^\[.*?\]匹配字符串开头的空心方括号和最接近方括号的最短字符数。

正则表达式\(Saved.*?\)匹配左括号后跟单词Saved和最短字符数直到右括号。但是,由于此部分是可选的,因此您需要通过将表达式置于非捕获组并向其附加?修饰符((?:...)?)来指示表达式可以出现零次或一次。

将您想要保留的子匹配放在括号中以创建捕获组

^\[.*?\] (.*?): (?:\(Saved.*?\))?(.*)

replace每个匹配的行只包含捕获的组:

Set re = New RegExp
re.Pattern = ...

Set f = fso.OpenTextFile(filename)
Do Until f.AtEndOfStream
  MsgBox re.Replace(f.ReadLine, "$1 $2")
Loop
f.Close

对您现有代码的一些评论:

  • For i = 1 To LNENUMs:此循环始终被跳过,因为您将LNEUMs设置为0.由于您只在f.ReadLineFor循环外Do }循环变成一个无限循环,因为你永远不会把文件读到最后。
  • Len("(S")+4始终求值为6,因为字符串(S的长度不会改变,因此您只需用数值替换表达式。
  • MsgBox = LNEVALMsgBox功能无法正常工作。删除函数名称和消息之间的=