2012-01-27 10 views
0

以下は、既にソートされている私のファイルの内容です。角かっこの間には、1つのトランザクションが関係します。トランザクションはgroupcなどグループA、グループB、ファイルの操作 - 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を使用して別のファイルに出力し、以下のデータが欲しいです。トランザクショングループとその次に時間が含まれている必要があります(トランザクションによってグループ化されたコンテンツの最初の行から取得し、コンテンツ内の角カッコ内の番号でグループ化します)。次の行は、角カッコ内の数字でグループ化された特定のトランザクションに対応するデータ(Part [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 

ファイルからテキストをロードしています。どのようにテキストを取得するかは関係ありません。その後、各行を繰り返し、正規表現で情報を収集します。それを解析したら、を作成してリストに追加します。リストとしてこれは働きやすくなります。我々はそれをプリントアウトし、その後、グループに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たちは、私が文字列として代わりに公共プロパティグループの文字列としてパブリック・グループを使用してみましたし、同様に他のメンバーのために取得し、公共財産のための方法を設定する必要がありますか? 。しかし、それが原因であるかどうかわからない場合は、 "タイプ 'のオブジェクトをキャストできません' WhereSelectEnumerableIterator'2 [errorfileprocessor.LogEntry、System.String] '' System.String [] 'を入力してください。エラー:Console.writeline(string.join – Suresh

+0

@Maneesh - 私はVB 11を使用していますが、[自動実装プロパティ](http://msdn.microsoft.com/en-us/library/dd293589.aspx) Visual Studio/VB.NETのバージョンは? – vcsjones

+0

私はVisual studio 2008を使用しています – Suresh

関連する問題