对文件的操作-vb.net加上一些regex



下面是我的文件(已经排序)的内容。无论方括号之间是哪一个,都与一笔交易有关。交易可以是a组、b组、c组等。

Jan 2012 02:10:12 [5678](groupa):Part 1:data1
Jan 2012 02:10:12 [5678](groupa):Part 2:data2
Jan 2012 02:10:12 [5678](groupa):Part 3:data3
Jan 2012 02:10:12 [5678](groupa):Part 4:data4
Jan 2012 02:13:14 [12308](groupa):Part 1:data1
Jan 2012 02:13:14 [12308](groupa):Part 2:data2
Jan 2012 02:13:24 [34517](groupb):Part 1:data1
Jan 2012 02:13:24 [34517](groupb):Part 2:data2

我想使用vb.net将以下数据输出到另一个文件中。它应该包含事务组,然后是时间(时间应该从内容的第一行开始,按事务分组,然后按内容中方括号内的数字分组)。下一行应该连接数据(在第[1-9]部分之后:),对应于按方括号内的数字分组的特定事务。对于上述内容,

groupa at Jan 2012 02:10:12
data1data2data3data4
groupa at Jan 2012 02:13:14
data1data2
groupb at Jan 2012 02:13:24
data1data2 

因此,首先让我们创建一个类来表示该数据。这将使它更容易工作。以下是我的样子:

Public Class LogEntry
    Public Property DateTime As DateTime
    Public Property Id As Integer
    Public Property Group As String
    Public Property Part As String
    Public Property Data As String
End Class

既然我们已经知道了,让我们用一个正则表达式解析每一行。它们不是我的强项,但在这种情况下它有效:

Dim text = File.ReadAllLines("log.log")
Dim rx As New Regex("^(?<date>.+)s[(?<id>d+)]((?<group>.+)):(?<part>.+):(?<data>.+)$")
Dim logEntries As New List(Of LogEntry)
For Each line In text
    Dim match = rx.Match(line)
    Dim entry As New LogEntry With _
        {
            .DateTime = DateTime.ParseExact(match.Groups("date").Value, "MMM yyyy hh:mm:ss", System.Globalization.CultureInfo.CurrentCulture),
            .Id = Int32.Parse(match.Groups("id").Value),
            .Group = match.Groups("group").Value.Trim(),
            .Part = match.Groups("part").Value.Trim(),
            .Data = match.Groups("data").Value.Trim()
        }
    logEntries.Add(entry)
Next

在这里,我们正在从一个文件加载文本。它如何获得文本并不重要。之后,我们对每一行进行迭代,并使用正则表达式收集信息。解析后,我们创建一个LogEntry并将其添加到列表中。作为一个列表,这将使工作更容易。我们可以使用LINQ进行分组,然后打印出来:

Dim grouped = logEntries _
.GroupBy(Function(x) New With {Key .Id = x.Id, Key .Group = x.Group, Key .DateTime = x.DateTime}) _
.OrderBy(Function(x) x.Key.DateTime)
For Each group In grouped
    Console.WriteLine("{0} at {1:MMM yyyy hh:mm:ss}", group.Key.Group, group.Key.DateTime)
    Console.WriteLine(String.Join("", group.Select(Function(x) x.Data)))
Next

最新更新