2011-10-20 4 views
0

정규 표현식을 사용하여 CSV 형식의 데이터를 구문 분석하는 일부 코드를 상속 받았습니다. 전에는 빈 문자열 필드를 처리 할 필요가 없었지만 빈 문자열 필드가 가능하도록 요구 사항이 변경되었습니다.CSV 정규식

나는이에서 정규 표현식을 변경 :

new Regex("((?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")+)\")(,|(?<rowbreak>\\r\\n|\\n|$))"); 

에이

new Regex("((?<field>[^\",\\r\\n]*)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))"); 

(즉 내가 변경된 + *로)

문제는 내가 지금있는 것입니다 마지막에 여분의 빈 필드를 얻는다. "ID, 이름, 설명"은 나에게 "ID", "이름", "설명"및 ""

필드를 표시 할 수 있습니까?

+0

저는 C#에 익숙하지 않지만 CSV를 구문 분석 할 수있는 패키지/모듈/클래스가 없습니까? –

+0

상자 안의 @Felix는 아니지만, 약 172 억 개의 구현이 있습니다. – Jamiec

+0

처리 할 대상 : 'Id ,, Name'? – xanatos

답변

2

는 :

var rx = new Regex("((?<=^|,)(?<field>)(?=,|$)|(?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))"); 

나는 세 번째 "또는"을 "빈"필드의 처리를 이동합니다.

, 
,Id 
Id, 
Id,,Name 

그리고이 하나 지금 ""의 처리가 이미 일 (당신이 그것을 수정해야하지 않았다, 그것은 코드의 두 번째 (?<field>) 블록이었다), 그래서 당신이 처리 할 필요가 무엇을 사가지 경우입니다 그것을 수행해야합니다

가 빈 필드가 행 ^의 시작에 의해 또는 ,을 덧붙일해야
(?<=^|,)(?<field>)(?=,|$) 

, 길이가 0이어야합니다 (거기 (?<field>) 캡처 아무것도되지 않았 음)가 와야합니다 , 또는 줄 끝 부분 $.

+0

감사합니다. 이것은 작동하는 것 같습니다. 모든 유닛 테스트가 끝나고 있습니다. –

1

FileHelpers 라이브러리를 사용하는 것이 좋습니다. 사용하기 쉽고 작업을 수행하고 코드를 관리하는 것이 훨씬 쉽습니다. 이것은

+0

FileHelpers는 임의의 필드를 사용하여 CSV 데이터를 읽을 수 있습니까? –

+0

@EasyTimer : 임의적으로 무엇을 의미합니까? 어쨌든 라이브러리를 사용하여 csv 파일을 자신의 클래스로 역 직렬화 할 수 있으며 라이브러리는 선택적 (빈) 필드도 지원합니다. –

+0

@Paulo, 런타임까지 CSV 파일의 형식을 알 수 없습니다. 즉, 우리는 그것이 포함될 수있는 필드를 모른다. 내 이해 FileHelpers 클래스를 미리 데이터를 보유하도록 만들 수 있도록 구조를 향해 기어드 것입니다. –

1

정규식의 문제점은 빈 문자열과 일치한다는 것입니다. 이제 $은 lookahead와 조금 다른 방식으로 작동합니다. 일치하는 부분이 문자열의 끝 부분에 있음을 보장하지만 일치 항목에 포함되지는 않습니다. 당신이 "ID, 이름, 설명을"있을 때

그래서, 당신의 첫 경기는

ID,

이며, 나머지는 그 다음 다음 경기가

Name,입니다 "Name,Description"

이고 나머지는 "Description"입니다

다음 경기는 다음과 같습니다.

Description이고 나머지는 ""

따라서 최종 일치는 빈 ​​문자열과 일치합니다.

+0

감사합니다. @Peter. 그것은 내가 여분의 빈 문자열을 얻는 이유에 대한 좋은 설명이다. –