2014-12-22 3 views
2

사용하여 CSV 컬럼에 내 질문은 다음과 같습니다.교체 연구 n 정규식

내가 컬럼의 데이터가 큰 따옴표 (")를 사용하여 동봉되어 csv 파일을
의 끝 라인이 \r\n입니다 (16 진수 값 : 0D0A)

내 문제 :.. 열 캔 포함 \r\n (그것은 일반적으로 캐리어 복귀와 서면 문장)
내가 엑셀에서 CSV를로드 할 때, 생 s \ r \ n은 새 줄로 이해됩니다.

내 문제 해결 솔루션입니다 :

  • 열이 따옴표로 시작하고 진짜 새로운 라인 \ r을 식별한다
  • 따옴표 마무리 : 사용 정규식은 다음과 같은 논리를 할 \ n
  • 문제있는 열은 큰 따옴표 (")로 시작은 \ r \ n을 포함하고 따옴표로 마무리 각 P에 대한 (")

    (20 진수 값)
    단부

C 번호와 regex를 사용하는 솔루션을 roblematic 컬럼
공간으로 \ r \ n을 교체 (사용 정규식) 발견?

덕분에 당신의 도움

+0

빠른 주석 주셔서 감사합니다.하지만 정규 표현식을 사용하여 algo를 완성하고 싶습니다. 문제가있는 열의 문자열을 찾는 방법? – Julien

답변

1

문제가되는 항목을 쉽게 찾을 수있는 방법은 생각할 수 없지만 (큰 따옴표가있는 것은 아닙니다.) 큰 따옴표로 묶인 모든 항목을 쉽게 찾을 수 있습니다.

var result = Regex.Replace(input, @"""(?:(\r\n)|[^""])+""", delegate(Match m) 
      { 
       if (string.IsNullOrEmpty(m.Groups[1].Value)) 
        return m.Value; 
       return m.Value.Replace("\r\n", " "); 
      }); 

가능한 문제 : 파일이 큰 따옴표 문자를 탈출 한 경우

이 작동하지 않을 수 그들이 ptoblematic 있다면 그런 다음 변경할 수 있습니다. 테스트 해봐야 할 것입니다.

0

에 대한 많은 내가 CSV 파일이 처음부터 유효하며, 큰 따옴표 " 문자는 필드의 일부가 아닌 것으로 가정합니다.

첫 번째 가정은 여기서 작업을 줄이는 것이 중요합니다. 그것이 사실이 아니라면 CSV 파서를 사용하여 파일을 구문 분석 한 다음 각 열을 대체해야합니다.

큰 따옴표가 CSV에서 어떻게 이스케이프되는지 알고있는 경우 작은 수정으로 두 번째 가정을 제거 할 수 있습니다. """으로 지정되면 아래 코드의 [^\"](?:[^\"]|\"\")으로 변경하십시오. "\"으로 지정되면 아래 코드의 [^\"](?:[^\\\\\"]|\\\\.)으로 변경하십시오. 유효한 CSV를 들어

^"?[^"]*"(,"[^"]*")*$ 

:

라인하여 파일 라인을 읽고 다음과 같이 처리 :

if (Regex.IsMatch(line, "^\"?[^\"]*\"(,\"[^\"]*\")*$")) { 
    // Write the current line to file with line ending 
} else { 
    // Write the current line to file without line ending 
} 

이 쉽게 이해할 수 있도록 나 문자열 리터럴 이스케이프를 제거 할 수 있도록 위의 정규 표현식은 행에 새로운 행이있는 열이 없으면 전체 행/행과 일치하거나 새로운 행이있는 열이있는 행의 마지막 행과 일치합니다. 필자는 줄 바꿈 문자를 추가하지 않으려는 줄을 탐지하는 데 사용합니다.