2012-04-11 64 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

看起來像另一個不使用正則表達式的簡單答案。如果每一行都是行,那麼對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 +殼牌石油公司57529380602椰子溪* FL + AUT 021012 VISA DDA PUR + 2/10DEBIT CARD PURCHASE35.05 甚至是借記交易之後交換和含有日均餘額。 – 2012-04-14 04:08:25

+0

然後就不會很難設置兩個對象(或者你需要的那麼多),在第一行運行正則表達式來檢測類型,然後運行適合該對象的代碼,直到讀到物體。 – 2012-04-14 06:34:45

1

我想你想的起來一行首先每四行加入:

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)); 

那麼你實際上可以解析緩衝區中的每個條目,彷彿這是一條線。這可以使用正則表達式或只是字符串子串來輕鬆完成。比跨越線路做起來要容易得多。

上面的代碼不是最乾淨的,但它的工作原理。

+0

我無法首先將所有的線條連接在一起。我還需要確定天氣的描述也是一兩行。爲什麼我首先使用正則表達式的主要原因。 也請閱讀@Erik的評論 – 2012-04-14 04:14:02

+0

它不一定是每行4行。您可以將上面的代碼中的4更改爲變量,並在每個開始行上動態決定在解析之前還需要多少。這個建議主要是通過兩次傳球更容易。一個將相關的行結合在一起,第二個從這些行提取數據。什麼是每種記錄的識別方面? – yamen 2012-04-14 06:52:10