2011-02-17 5 views
3

C#을 사용하여 채팅에서 로그 파일을 구문 분석하려고하는데, 실행중인 문제는 표준 구분 기호를 사용하지 않으므로 구문 분석을 위해 실제로 설계되지 않았기 때문입니다. . 날짜 및 시간은 날짜 시간 유형여러 구분 기호 유형을 사용하여 필드에 텍스트 파일 구문 분석

은 messageType

는 userName

로 가입 :

2010-08-09 02:07:54 [Message] Skylar Morris -> (ATL)City Waterfront: I'll be right back 
date time messageType userName -> roomName: message 

내가 저장하고 싶은 분야는 다음과 같습니다 파일에서 전형적인 라인의 예

roomName

메시지

공백, 탭 또는 쉼표와 같은 표준 구분 기호로 분리 할 수 ​​있다면 상당히 간단 할 것입니다. 그러나 나는 이것을 공격하는 방법을 놓치고 있습니다.


같은 템플릿으로이 코드를 사용하여, 후속 :

List<String> fileContents = new List<String>(); 
string input = @"2010-08-09 02:07:54 [Message] Skylar Morris -> (ATL)City Waterfront: I'll be right back"; 
string pattern = @"(.*)\[(.*)\](.*)->(.+?):(.*)"; 

foreach (string result in Regex.Split(input, pattern)) 
{ 
    fileContents.Add(result.Trim()); 
} 

을 나는 7 개 요소 것으로 예상되는 5 (전후 한 빈)을 얻고있다. 이 문제를 어떻게 해결할 수 있습니까?

foreach (string result in Regex.Split(input, pattern) 
     **.Where(result => !string.IsNullOrEmpty(result))**) 
{ 
    fileContents.Add(result.Trim()); 
} 

좋아요, 위 코드로 해결할 수 있습니다.

답변

5

당신은 "어떤 사람들은 문제에 직면했을 때"내가 알기 때문에 정규 표현식을 사용할 것 "이라고 오래된 경구를 알고 있습니다. 이제 그들은 두 가지 문제가 있습니다."

이 경우에는 정규식이 필요합니다.

이 하나이 경우를 포함한다 :

([\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2}) \[([\w]+)\] ([a-zA-Z0-9 ]+) -> (\([\w]+\)[a-zA-Z0-9 ]+): (.*) 

당신이 정말로 생각을 테스트해야합니다. 방금 이걸 던져 버렸고 당신이 볼 수있는 모든 것을 다 처리하지 못했을 수도 있습니다.

+0

나는 정규 표현식이 답이 될 거라 생각했는데, 경험이 거의없는 부분 일 뿐이다. 나는 그것을 시도하고 다시보고 할 것이다. – Chris

+0

학습하고 실험하기 위해 시간을 할애하고 싶다면 http://gskinner.com/RegExr/을 참조하십시오. 더 나은 도구가 있지만 사용하는 OS가 무엇인지 알 수 없습니다. 또한 위의 표현식이이를 사용하기 때문에 '그룹'이 정규 표현식에 포함되어 있는지 확인하는 것이 좋습니다. 그러면 그 표현식을 사용하는 방법을 알아야합니다. –

+0

리눅스 (우분투 구체적으로) – Chris

2

이 시도 :

.*\[(.*)\](.*)->(.+?):(.*) 

그것은 그 메시지는 대괄호 [] 이름은 []와 사이에 사실 사용 -> 방 이름 사이에 ->과 : 및 메시지 모든 이후입니다 . :)

+1

나는 너의 것을 좋아한다. 이해하기 쉽고 설명하기가 훨씬 쉬우 며 그 이유 때문에 더 강력 할 것입니다. –

+0

@Oren, 감사합니다.나는 그것을 단순하게 유지하려고 노력한다. (나는 당신이 당신의 hehe에서 방금 사용한 모든 명령을 모르기 때문에) – Joe

+0

나는 최근에 (맥에서 regexhibit) 시각화 도구를 사용하기 시작했는데, 내 마음이 많이 열렸다. 내가 알지 못했던 깔끔한 트릭을 단순한 거의 항상 더 낫다. –