문제

각 레코드의 각 필드가 고정 너비 인 레코드로 가득 찬 텍스트 파일이 있습니다. 첫 번째 접근 방식은 string.substring ()을 사용하여 단순히 각 레코드를 구문 분석하는 것입니다. 더 좋은 방법이 있습니까?

예를 들어, 형식은 다음과 같이 설명 할 수 있습니다.

<Field1(8)><Field2(16)><Field3(12)>

그리고 두 개의 레코드가있는 예제 파일은 다음과 같습니다.

SomeData0000000000123456SomeMoreData
Data2   0000000000555555MoreData    

나는 단지 substring ()보다 더 우아한 방법을 간과하지 않도록하고 싶습니다.


업데이트: 나는 궁극적으로 Killersponge가 제안한 것과 같은 동정인과 함께 갔다.

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled);
const string REGEX_LOT = "^(?<Field1>.{6})" +
                        "(?<Field2>.{16})" +
                        "(?<Field3>.{12})";

그런 다음 다음을 사용하여 필드에 액세스합니다.

Match match = reLot.Match(record);
string field1 = match.Groups["Field1"].Value;
도움이 되었습니까?

해결책

서브 스트링은 나에게 좋은 것 같습니다. 내가 즉시 생각할 수있는 유일한 단점은 매번 데이터를 복사하는 것을 의미하지만 병목 현상이라는 것을 증명할 때까지는 걱정하지 않을 것입니다. 서브 스트링은 간단합니다 :)

~할 수 있었다 정규식을 사용하여 한 번에 전체 레코드와 일치하고 필드를 캡처하지만 과도하게 생각합니다.

다른 팁

사용 파일 헬퍼.

예시:

[FixedLengthRecord()] 
public class MyData
{ 
  [FieldFixedLength(8)] 
  public string someData; 

  [FieldFixedLength(16)] 
  public int SomeNumber; 

  [FieldFixedLength(12)] 
  [FieldTrim(TrimMode.Right)]
  public string someMoreData;
}

그런 다음 이것만큼 간단합니다.

var engine = new FileHelperEngine<MyData>(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 

왜 바퀴를 재창조합니까? .NET을 사용하십시오 TextFieldParser 이것에 따라 수업 Visual Basic의 방법.

줄의 끝이 필드를 채우기 위해 공간으로 채워지지 않으면, 당신의 서브 스트링은 약간의 글을 읽지 않기 위해 약간의 충격을받지 않고 작동하지 않습니다. 물론 이것은 마지막 필드에만 적용됩니다 :)

불행히도 상자에서 CLR은 이것에 대한 하위 문자 만 제공합니다.

CodeProject에서 누군가가 필드를 정의하기 위해 속성을 사용하여 사용자 정의 파서를 만들었습니다., 당신은 그것을보고 싶을 수도 있습니다.

아니, 서브 스트링은 괜찮습니다. 그게 바로 그게되었습니다.

고정 형식 파일에 대한 ODBC 데이터 소스를 설정 한 다음 다른 데이터베이스 테이블로 액세스 할 수 있습니다. 이것은 파일 형식에 대한 특정 지식이 그 운명적인 날을 위해 코드에 컴파일되지 않는다는 이점이 추가되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top