【问题标题】:manipulation on a file - vb.net plus some regex对文件进行操作 - vb.net 加上一些正则表达式
【发布时间】:2012-01-27 23:45:57
【问题描述】:

以下是我的文件的内容(已经排序)。方括号之间的任何一个都与一笔交易有关。交易可以是groupa、groupb、groupc等。

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 

【问题讨论】:

    标签: regex vb.net


    【解决方案1】:

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

    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
    

    【讨论】:

    • Thanks.dont 我们需要公共属性的 get 和 set 方法吗?我尝试使用 Public Group As String 而不是 Public Property Group As String,对于其他成员也是如此。但不确定,如果是因为这个,得到一个“无法将'WhereSelectEnumerableIterator`2[errorfileprocessor.LogEntry,System.String]'类型的对象转换为'System.String[]'。” Console.writeline 错误(string.join
    • @Maneesh - 我使用的是 VB 11;其中有Auto-Implemented Properties。你用什么版本的 Visual Studio / VB.NET 编译?
    • 如果我们在 Visual Studio 2008 中使用 ToArray 函数,该错误就消失了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2013-10-07
    相关资源
    最近更新 更多