2012-09-13 96 views
3

我有一個文本文件,我希望能夠找到「Acct Nbr:」的任何實例,並抓住「Queue Number:」,「Queue Description:」的前面幾行,以及隊列號後的第5行稱爲ApplNbr。如果之前有其他應用,它並不總是第5行。這行總是3列數字。例如:「5024 17 110」或「964 16 100」用python抓取多條非連續線

正如您所見,每個隊列有時會有多個「Acct nbr:」條目,但大多數時間只有一個。如果可能的話,在一個Queue號碼行下有多個Acct nbr將會很好。在這個文本文件中有成千上萬的條目,我只需要查找由Acct nbr標識的這些錯誤:但是我需要隊列號,隊列描述和每個錯誤的應用程序。我希望我很清楚。

我用「 - >」標記了所需的行。我想使用python,但我可以使用其他腳本語言,如powershell或使用像grep這樣的gnu實用程序。

謝謝你的時間和關注。

文本樣本解析:

->Queue Number: 87125 Queue Effective Date: 09-05-2012 Queue Scheduled Date: 09-05-2012 

->Queue Description: **Posting File** Processing Queue Type Description: PM File Load Copy 

    Appl QSub Seq Appl     Appl  Return Start  Stop Time of Run 

    Nbr Nbr Nbr Description   Name  Code  Time  Time (In Minutes) 

->386 2  0 Inclearing Processing AH_CLEAR 0  12:07:21 12:07:56  0.583 

    Procedure Complete 
    *************** Batch Application Errors *************** 

->Acct Nbr: 0000000000  Batch Actv Msg: Bank Check Not Processed - Validation Error 

->Batch Oracle Msg: 

->Acct Nbr: 0000000000  Batch Actv Msg: Bank Check Not Processed - Validation Error 

->Batch Oracle Msg: 

所需的輸出:

Queue Number: 87125 Queue Effective Date: 09-05-2012 Queue Scheduled Date: 09-05-2012 

Queue Description: **Posting File** Processing Queue Type Description: PM File Load Copy 

386 2  0 Inclearing Processing  AH_CLEAR 0  12:07:21 12:07:56  0.583 

Acct Nbr: 0000000000  Batch Actv Msg: Bank Check Not Processed - Validation Error 
Batch Oracle Msg: 

Acct Nbr: 0000000000  Batch Actv Msg: Bank Check Not Processed - Validation Error 
Batch Oracle Msg: 

回答

3

迭代與存儲最新Queue NumberQueue Description狀態機的每一行。當您找到Acct Nbr時,請使用存儲的值生成輸出。

快速未經測試的例子,請適應自己的需要:

class State(object): 

    qnumb = None 
    qdesc = None 

    def feed(self, line): 
     if line.startswith('Queue Number'): 
      self.qnumb = line 
     elif line.startswith('Queue Description'): 
      self.qdesc = line 
     elif line.startswith('Acct Nbr'): 
      return line, self.qnumb, self.qdesc 


def parse(lines): 
    results = [] 
    s = State() 
    for line in lines: 
     entry = s.feed(line) 
     if entry: 
      results.append(entry) 
    return results 
+0

謝謝您的回答。現在我需要學習使用一個類,以便我可以實現這一點。 :) – user1669104

0

由於您想行具有特定的格式,我想我會用正則表達式來匹配輸入想要的線條。您可以使用re.search()來返回匹配對象與所需內容。

您可以在此處詳細瞭解正則表達式: http://docs.python.org/py3k/library/re.html

+0

感謝您的鏈接。我也會研究正則表達式。 – user1669104