2012-01-27 2 views
0

아래 내용은 이미 정렬 된 내 파일의 내용입니다. 사각 괄호 사이에있는 어느 것이 든 하나의 거래와 관련됩니다. 거래는 내가 출력 vb.net을 사용하여 다른 파일에 아래의 데이터를 원하는에는 GroupA, GroupB가, groupc 등파일 조작 - 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 

수 있습니다. 트랜잭션 그룹을 포함하고 그 다음에 시간이옵니다 (트랜잭션으로 그룹화 된 내용의 첫 번째 행에서 시간을 가져온 다음 내용에서 대괄호 안의 숫자로 그룹화해야합니다). 다음 줄은 대괄호 안에있는 숫자로 그룹화 된 특정 트랜잭션에 해당하는 데이터 (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 

여기 파일에서 텍스트를로드하고 있습니다. 텍스트를 얻는 방법은 중요하지 않습니다. 그런 다음 각 행을 반복하고 정규 표현식을 사용하여 정보를 수집합니다. 일단 구문을 분석하면 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 우리가 얻을 및 공공 재산에 대한 설정 방법 필요 . 그러나 그것이 확실하지 않은 경우, "유형 '의 객체를 캐스팅 할 수 없습니다'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