2012-04-11 3 views
0
기본적으로

,데이터

내가 텍스트 블록에서 뱉어 할 텍스트를 구문 분석하는 정규 표현식을 공식화 도움이 필요합니다. 그러나 정규 표현식이 대부분 아래 부분을 차지하지는 않습니다. [섹션 건너 뛰기] 또는 너무 많이 [다음 섹션의 일부 읽기]입니다. 기본적으로 은행 명세서에서 추출한 텍스트를 읽어야합니다. 이미 시도했습니다. 정규 표현식을 더 읽는다면, 그러나 나는 아직도 무엇을 해야할지에 대한 단서가 없다.

당신이 내가하려는 일을 이해할 수있는 샘플을 소개합니다.

_4XXXXXXXXXXXXXX9_ 
_SOU THE HOME DEPOT 431  POMPANO BEACH * FL 
AUT 020112 DDA PURCHASE_ 
_2/1_DEBIT POS_3.15_ 

밑줄은 기본적으로 추출하려는 부분입니다. 기본적으로 DEBIT POS를 제외한 모든 것.

그리고 내가 사용 정규식은 다음과 같습니다

\A 
(?<SerialNumber>\b[0-9]{13,16}\b) 
(?<Description>.) 'PROBLEM HERE' 
(?<PostingDate> 
(?:1[0-2]|[1-9])/(?:3[01]|[12][0-9]|[1-9])) 
(?<Amount>[,0-9]+\.[0-9]{2}) 
\Z 

나는 텍스트 부분이 될 것이라고 최대 길이를 알 수 없기 때문에 문자의 길이에서 될 수있는 설명을 설정 캔트. 나 또한 설명을위한 2 줄 또는 단지 1인지 모르겠다. 그게 내가 주로 혼란 스러워요.

답변

0

Regex를 사용하지 않는 또 다른 간단한 대답처럼 보입니다. 이들 각각이 라인 인 경우, File.ReadAllLines()은 그리 어렵지 않을 것이며 각 라인을 파싱 할 것입니다.

public class Order 
{ 
    public string SerialNumber { get; set; } 
    public string Description { get; set; } 
    public DateTime PostingDate { get; set; } 
    public Decimal Amount { get; set; } 

    public void SetSerialNumberFromRaw(string serialNumber) 
    { 
    // Convert to required type, etc. 
    this.SerialNumber = <someConvertedValue>; 
    } 
    public void <OtherNeededValueConverters> 
}  

List<string> lines = File.ReadAlllines("<filename").ToList(); 
List<Order> orders = new List<Order>(); 

Order currentOrder = null; 
foreach (string line in lines) 
{ 
    if (currentOrder = null) 
    { 
    currentOrder = new Order(); 
    orders.Add(currentOrder); 
    currentOrder.SetSerialNumberFromRaw(line); 
    } 
    else 
    { 
    if (line.Contains("DEBIT POS", CultureInfo.CurrentCultureIngoreCase)) 
    { 
     currentOrder.SetPostingDateAndAmount(line); 
     currentOrder = null; 
    } 
    else 
    { 
     currentOrder.SetAppendDescription(line); 
    } 
    } 
} 
+0

정규식을 사용하는 이유는 첫 번째 줄이 차변 거래인지 또는 수표인지 아닌지를 알아야하기 때문입니다. 그들은 라인 길이에 따라 다르며 [PDF에서 추출하여 모든 쓰레기를 제거해야합니다.] 모든 거래에 DEBIT POS가 있다고 말할 수는 없습니다. + 4XXXXXXXXXXXXXXX3 + SHELL OIL 57529380602 COCONUT CREEK * FL + AUT 021012 VISA DDA PUR + 2/10DEBIT 카드 PURCHASE35.05 또는 오른쪽 직불 거래 후 교환 및 일상 균형이 포함되어 있습니다. –

+0

그런 다음 두 개의 객체 (또는 필요한만큼)를 설정하는 것이 어렵지 않을 것입니다. 형식을 감지하기 위해 첫 번째 행에서 정규 표현식을 실행 한 다음 해당 객체의 끝에 읽을 때까지 해당 객체에 맞는 코드를 실행하십시오. 그 물체. –

1

난 당신이 함께 같은 한 줄 첫번째 매 4 개 라인을 가입하려는 생각 :이 한 줄 인 것처럼

var file = @"C:\temp.txt"; 
var lines = System.IO.File.ReadAllLines(file); 
var buffer = new List<String>(); 

for (var i = 0; i < lines.Length; i++) 
{ 
    if (i % 4 == 0) { buffer.Add(""); } 
    buffer[buffer.Count - 1] += lines[i] + " "; 
} 

buffer.ForEach(b => Console.WriteLine(b)); 

그런 다음 당신은 실제로 버퍼의 각 항목을 구문 분석 할 수 있습니다. 이 작업은 정규 표현식 또는 문자열 substring을 사용하여 쉽게 수행 할 수 있습니다. 라인을 가로 질러 시도하는 것보다 훨씬 쉽습니다.

위 코드는 가장 깨끗한 것이 아니지만 작동합니다.

+0

모든 라인을 먼저 결합 할 수 없습니다. 또한 설명이 한 줄 또는 두 개일 것이라는 날씨를 결정해야합니다. 왜 내가 정규식을 사용하는지 주된 이유. 또한 @Erik에 대한 의견을 읽어보십시오. –

+0

매번 4 줄로 작성하지 않아도됩니다. 위의 코드에서 4를 변수로 변경하고 구문 분석하기 전에 각 시작 행에서 동적으로 더 많은 변수를 결정할 수 있습니다. 제안은 기본적으로 두 번 통과하는 것이 더 쉽습니다. 하나는 관련 라인을 함께 결합하고 두 번째는 해당 라인에서 데이터를 추출합니다. 각 레코드 유형의 식별 측면은 무엇입니까? – yamen