python - 用 python 抓取多条不连续的行

标签 python text

我有一个文本文件,我希望能够找到“Acct Nbr:”的任何实例并获取“Queue Number:”、“Queue Description:”的前几行以及 Queue Number 之后的第 5 行名为 ApplNbr .如果前面有其他应用程序,它不会总是第 5 行。这一行总是 3 列数字。例如:“5024 17 110”或“964 16 100”

如您所见,有时每个队列有多个“Acct nbr:”条目,但大多数时候只有一个。如果可能的话,在一个 Queue 编号行下有多个 Acct nbr: 会很好。此文本文件中有数千个条目,我只需要查找由 Acct nbr: 标识的这些错误,但我需要每个错误的队列号、队列描述和应用程序编号。我希望我说清楚了。

我用“->”标记了所需的行。我想使用 python,但我愿意使用其他脚本语言,如 powershell 或使用 gnu 实用程序,如 grep。

感谢您的时间和关注。

要解析的文本示例:

->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:

最佳答案

使用存储最新队列编号队列描述 的状态机迭代每一行。当您找到 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

关于python - 用 python 抓取多条不连续的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410835/

相关文章:

c - Motif 编程和 UTF-8

python - 寻求使用python在大文件中进行正则表达式

python - 恢复Tensorflow模型方式差异

Java-Hangman ASCII 艺术奇怪的输出

css - flexbox布局中的垂直文本

javascript - 另存为文本文件 JavaScript

python - 正则表达式替换 Python

python - "CSRF token missing"带有 PUT/DELETE 方法 Rest-framework

python - 运行 reactor.run() 后启动 TCP 客户端

python - virtualenv下Pycharm subprocess.Popen python