3

「Acct Nbr:」の任意のインスタンスを検索し、「Queue Number:」、「Queue Description:」の前の行、および ApplNbr と呼ばれる Queue Number の後の 5 行目を取得できるテキスト ファイルがあります。その前に他のアプリがある場合、必ずしも 5 行目とは限りません。この行は常に 3 列の数値です。例: 「5024 17 110」または「964 16 100」

ご覧のとおり、キューごとに複数の "Acct nbr:" エントリがある場合もありますが、ほとんどの場合は 1 つしかありません。可能であれば、1 つのキュー番号行の下に複数の 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:
4

2 に答える 2

3

最新のQueue Numberとを格納するステート マシンですべての行を繰り返しQueue 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
于 2012-09-13T16:36:34.943 に答える
0

必要な行には特定の書式設定があるため、入力の必要な行に一致するように正規表現を使用すると思います。これには、必要なコンテンツを含む一致オブジェクトを返す re.search() を使用できます。

正規表現の詳細については、http: //docs.python.org/py3k/library/re.htmlを参照してください。

于 2012-09-13T16:47:47.823 に答える