2012-09-13 55 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