2012-09-20 14 views
2

열로 서식이 지정된 텍스트 보고서를 구문 분석하려고합니다. 각 열은 고정 길이로 오른쪽 정렬됩니다. 각 행마다 모든 열이 사용되는 것은 아닙니다. 이 경우 공백은 행의 각 열을 양쪽 정렬하는 데 사용됩니다. 예 입력 :고정 된 열 너비의 가변 길이 문자열 구문 분석 C#

031 91 1221,154 
043 66  312,222 1  3,047      3,047 1.5% .9% 
040 118  529,626 1  1,842      1,842  .8% .3% 
037 45  427,710 
019 80  512,153 1  14,685      14,685 1.2% 2.8% 
009 68  520,301      1 16,085  16,085 1.4% 3.0% 
030 13  106,689      1  1,581  1,581 7.6% 1.4% 
008 54  377,593 1  7,098      7,098 1.8% 1.8% 
018 24  171,264 
022 25  8,884 1  433       433 4.0% 4.8% 
035 9  42,043 
041 13  112,355 

폭은 다음과 같이 표시 될 열 (공백 문자에 포함 계산) 3,5,12,6,10,7,10,11,8,7.

이것을 파싱하는 좋은 방법은 무엇입니까? 정규 표현식을 사용하여 시도했지만, 전체 행에 데이터가있을 것으로 기대하는 식을 사용하기 때문에 첫 번째 행을 읽을 때 분명히 실패합니다.

문자열 패턴 = @ "^ (?. (? {10}) (?. {10}) (?. {10}) (? {12}) (?

해당 열에 데이터가 있는지 여부에 따라 적절한 변수를 읽는 좋은 방법을 찾고 있습니다. 내가 필요로하는 것처럼 느껴집니다. (예 : {8}) (? 에서 if 검사의 무리를 던져,하지만이 바라고하는 것은 내가 생각하고 있지 않다 더 나은 방법입니다.

덕분에 어떤 도움을.

BTW - StreamReader 및 ReadLine을 사용하여 선을 읽습니다.

답변

6

정규 표현식을 사용하지 마십시오. 당신은 그래서 그냥 String.SubstringString.Trim을 사용, 열 및 그 열의 폭의 번호를 알고 :

string field1 = line.Substring(0, 5).Trim(); 
string field2 = line.Substring(5, 3).Trim(); 
string field3 = line.Substring(12, 8).Trim(); 
/* etc, etc */ 
+0

아래쪽 투표와 함께 의견이 있으십니까? –

+1

내 대답과 마찬가지로 인덱스가 범위를 벗어나므로 맨 오른쪽 열이 채워지지 않은 행에서는이 작업이 실패합니다. 그러나 당신의 대답은 이것을 극복하기 위해 적응하기가 훨씬 쉬울 것입니다, 나는 기대합니다 :) – Rawling

+0

Substring 방법을 고려했기 때문에 누가 투표를했는지 모르겠습니다. Rawling은 나에게 새로운 것을 고려해 보았습니다.하지만 입력 라인에 패딩을 추가하는 것만으로는 Substring이 가장 쉬운 해결책이 될 것입니다 (Rawlings 방법을 배울 때까지). – Shawn

7

가 구체적으로 다음과 같이 고정 폭/구분 된 텍스트 파일을 읽기위한 것입니다 사용할 수있는 TextFieldParser 있습니다.

이것은 Microsoft.VisualBasic.FileIO 네임 스페이스에 있지만 여전히 C#에서 호출 할 수 있습니다.

TextFieldParser parser = new TextFieldParser(stream); 
parser.TextFieldType = FieldType.FixedWidth; 
parser.SetFieldWidths(3, 5, 12, 6, 10, 7, 10, 11, 8, 7); 
while (!parser.EndOfData) 
{ 
    //Processing row 
    string[] fields = parser.ReadFields(); 

    // Treat each field appropriately e.g. int.TryParse, 
    // remove the "%" then float.TryParse etc. 
} 
parser.Close(); 

편집 :

, Microsoft.VisualBasicusing Microsoft.VisualBasic.FileIO;을 참조를 추가, 다음 코드는 다음과 같습니다 반사판을보고, 말했다, 나는 당신의 단축 라인 전체가없는 경우이 오류가 발생 생각 너비만큼의 공백 이 문제를 해결할 것을 제안하는 방법을 잘 모르겠습니다. 한 줄에 누락 된 공백을 삽입하기 위해 스트림을 사전 처리 할 수 ​​있습니까?

-1

myDataString + 새 문자열 ('', 1000)에 대해 정규식 (또는 다른 것)을 확인하십시오.