2016-07-01 4 views
0

SSH에서 스크립트 작업을 사용하고 있습니다. 아래에 몇 가지 문자가있는 파일을 데이터베이스에로드하려고합니다.C# .net 정규식이 아닌 특정 문자를 제거하는 정규식이 작동하지 않습니다.

샘플 텍스트 -로 설정되어있다 -이 단어에서 복사 된 데이터를 다음과 같습니다 수정 - 봄 프로모션 2016

메모장 ++ 보여줍니다 Sample text

내가 그물 스크립트 [^\x00-\x7F]에서 정규식을 사용하지만, 비록 그것이 범위에서 떨어지더라도 대체됩니다. 나는이 특성을 바꾸고 싶지 않다. 내가 여기서 무엇을 놓치고 있니?

교체하지 않으면 이러한 문자가 비트 크기 이상을 차지하므로 잘라 내기 오류가 발생합니다.

편집 : 샘플 행을 추가했습니다. 처음 두 행에 문제가 있고 마지막 두 행에 문제가 없습니다.

123|NA|0|-.10000|Correction – Spring Promo 2016|.000000|gift|2013-06-29 
345|NA|1|-.50000|Correction–Spring Promo 2011|.000000|makr|2012-06-29 
117|ER|0|12.000000|EDR - (WR) US STATE|.000000|TEST MARGIN|2016-02-30 
232|TV|0|.100000|UFT/MGT v8|.000000|test. second|2006-06-09 

좋은 긴 주말 이후 : 나는 이것이 코드 페이지 오류로 인한 것이라고 생각하기 시작했습니다. 플랫 파일을로드 할 때의 정확한 오류 메시지는 다음과 같습니다.

오류 : 데이터 변환에 실패했습니다. NAME 열의 데이터 변환에서 상태 값 4와 상태 텍스트 "텍스트가 잘 렸습니다. 또는 하나 이상의 문자가 대상 코드 페이지에서 일치하지 않았습니다."가 반환되었습니다.

이것은 내 논문 패키지에서하는 것입니다.

  1. 플랫 파일의 유효성을 검사하는 스크립트 태스크.
    • 파일의 내용에 영향을주는 유일한 유효성 검사는 파일에서 구분 된 열의 수를 확인하는 것입니다. 나는 각 라인을 읽을 필요가있다. (여분의 파이프 구분자 (사용자 엔트리)가 있다면, 그 라인을 파일에서 제거하고 커스텀 테이블에 로그한다.)
    • StreamWriter 클래스를 사용하여 모든 유효한 줄을 임시 파일에 쓰고 끝에 파일의 이름을 바꾸거나 파일을 끝까지 이동합니다.
    • 사과하지만이 과정이 위와 같은 모든 내용을 이와 비슷한 것으로 변경한다는 사실을 눈치 채 셨습니다.

Notepad: Correction � Spring Promo 2016

는 어떻게 스크립트 작업이 일을 중지합니까? (솔루션이어야 함)

쉬운 방법이 아니라면 2 옵션을 사용하는 것입니다. 내 연결 관리자는 플랫 파일 원본과 OLEDB 대상입니다. OLEDB는 의 기본 코드 페이지를 사용합니다. 이러한 문자가 코드 페이지 1252에서 일치하지 않으면 사용해야하는 것은 무엇입니까? 코드 페이지를 변경하지 않고 다른 해결 방법이 있습니까?

스크립트 작업 :

     foreach (string file in files)... some other checks 
         { 
         var tFile = Path.GetTempFileName(); 
         using (StreamReader rFile = new StreamReader(file)) 
         using (var swriter = new StreamWriter(tFile)) 
         { 
         string line; 
          while ((line = rFile.ReadLine()) != null) 
          { 
           NrDelimtrInLine = line.Count(x => x == '|') + 1; 
           if (columnCount == NrDelimtrInLine) 
           { 
            swriter.WriteLine(line); 
           } 
           }}} 

는 너무 감사드립니다.

+1

당신의 스크립트 작업/구성 요소가 우리의 가정과 일치하는지 확인하십시오 – billinkc

+0

'[\ u {80} - \ u {10ffff}]'를 사용하여 비 ASCII를 식별 한 다음 _entities_, 즉'& #'(10 진수 또는 xHEX)';'이 html이면. 또는 유니 코드 문자열로 변환 할 수 있습니다. 예를 들어, 문자열은 'Correction \ u2013 Spring Promo 2016'이됩니다. 그것은 모두 텍스트의 표시를 렌더링하는 것에 달려 있습니다. 또한 0xFFFF보다 큰 문자를 예상 할 경우'\ Uxxxxxxxx'를 사용하는 것이 좋습니다. 그러나 이것은 컴파일 시간에 리터럴에만 적용됩니다. – sln

+0

네, 우선해야 할 일은 char 코드를 얻는 것입니다. 그런 다음 정규식을 진행할 수 있습니다. 16 진수 또는 다른 엔티티 표현으로 변환하고 질문을 업데이트하십시오. –

답변

1

"나는이 문자를 변경하고 싶지 않다"는 의도가 무엇인지 분명하지 않습니다. "잘라내기를 피하기 위해 대체해야합니다"와 상호 배타적 인 것처럼 보입니다. 내가 당신에게 더 많은 조언을하기 위해 코드를 볼 필요가있다.

일반적으로 항상 정규식 패턴을 코드 외부에서 테스트하는 것이 좋습니다. Matching Your Special Characters

당신이 당신의 특수 문자를 제외하고 아무것도 일치 할 경우 : 당신이 당신의 특수 문자를 일치 시키려면 나는 보통

http://regexr.com를 사용 Matching Non-Special Characters

아마의 컨텍스트를 볼 해치지 않을 것
관련 문제