2009-06-05 2 views
2

FileHelpers 라이브러리를 사용하여 다음 형식으로 CSV를 구문 분석하는 데 몇 가지 문제가 있습니다. 필자는 필드 분리 문자가 공백으로 보이기 때문에 약간 혼란 스럽지만 필드 자체는 따옴표로 묶여 있으며, 다른 경우에는 대괄호로 묶인 경우가 있습니다. 나는 이것을 파싱 할 수있는 RecordClass를 생성하려고합니다.FileHelpers 사용하기; 이 CSV 형식을 구문 분석하는 방법

xxx.xxx.xxx.xxx - - [14/Jun/2008:18:04:17 +0000] "GET http://www.some_url.com HTTP/1.1" 200 73662339 "-" "iTunes/7.6.2 (Macintosh; N; Intel)" 

그것은 우리가 우리의 대역폭 제공 업체 중 하나에서 수신하는 HTTP 로그에서 발췌입니다 :

다음은 CSV의 샘플입니다.

답변

2

내가 입력 한 내용에 대해 Marc Gravell과 Jon Skeet에게 감사하지만, 필자는 FileHelpers 라이브러리를 사용하여 설명 된 형식의 줄을 포함하는 파일을 구문 분석하는 방법에 대해 궁금해했습니다. (필자는 'CSV '사실, 그렇지 않은 경우).

이제 나는 이것을 수행하는 방법을 발견했습니다. 특히 가장 우아한 방법은 아니지만 작업이 완료됩니다.

[DelimitedRecord(" ")] 
public sealed class HTTPRecord 
{ 

public String IP; 

// Fields with prefix 'x' are useless to me... we omit those in processing later 
public String x1; 
[FieldDelimiter("[")] 
public String x2; 


[FieldDelimiter("]")] 
public String Timestamp; 

[FieldDelimiter("\"")] 
public String x3; 

public String Method; 
public String URL; 

[FieldDelimiter("\"")] 
public String Type; 

[FieldIgnored()] 
public String x4; 

[FieldDelimiter(" ")] 
public String x5; 

public int HTTPStatusCode; 

public long Bytes; 

[FieldQuoted()] 
public String Referer; 

[FieldQuoted()] 
public String UserAgent; 
} 
1

어떤면에서 CSV입니까? 그것은 꽤 쉽게 파싱되어야하는 특정 로그 파일 형식 인 것처럼 보이지만 CSV 파서는 그렇지 않습니다. 특히 정규식이 완벽하게 잘 작동한다는 것을 알 수 있습니다.

내가 유혹 할 것

사용 ...

+0

내 실수에 붙어 : 관심있는 사람들을 위해

이 솔루션은 다음과 같이 FileRecord 클래스를 만드는 것입니다) 이상적으로,이 특정 구현에 FileHelpers를 사용하지 않을 것 오늘 아침에 CSV 모드를 사용하고 있습니다. FileHelpers는 "파일에서 고정 길이 또는 분리 된 레코드의 데이터"를 읽습니다. 필자는 공백으로 구분 된 것으로 추측하지만 다른 필드 인용 부호를 사용한다고 가정합니다. 나는 정규식을 살펴볼 것이다. 고마워. – Richard

2

명백한 문은 "다음은 CSV되지 않는다"이다 (당신은 사용자 에이전트 등의 따옴표에 무슨 일이 일어날 지 확인해야합니다 것)을 빠른 정규식 라인별로 ... 같은 다른 모든으로 탈출에 날짜로 찾으면하기, 뭔가 같은 :

string t = Regex.Replace(s, @"\[([^\]]*)\]", @"""$1""") 

그런 다음 당신은 구분 기호로 공간을 사용하여 표준 파서를 사용할 수 있어야합니다 (따옴표 존중).

관련 문제