2012-01-27 43 views
0

以下是我的文件(已經排序)的內容。不管方括號中的哪一個,都涉及到一個事務。該交易可能是A組,B族,C組等對文件的操縱-vb.net加上一些正則表達式

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 

回答

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 
+0

Thanks.dont我們需要獲取和公共財產set方法我嘗試使用公共組作爲字符串代替公共地產集團作爲字符串,同樣對其他成員? 。但不確定,如果是因爲這樣,得到一個「無法轉換類型爲'WhereSelectEnumerableIterator'2 [errorfileprocessor.LogEntry,System.String]類型的對象來鍵入'System.String []'」。錯誤在Console.writeline(string.join – Suresh 2012-01-27 19:01:47

+0

@Maneesh - 我使用VB 11;它有[自動實施的屬性](http://msdn.microsoft.com/en-us/library/dd293589.aspx)。版本的Visual Studio/VB.NET你編譯? – vcsjones 2012-01-27 19:04:12

+0

我使用Visual Studio 2008 – Suresh 2012-01-28 04:48:39