2

正規表現を使用して Oracle トレース ファイルを解析しようとしています。私が選んだ言語は C# ですが、この演習では Ruby に慣れるために Ruby を使用することにしました。

ログ ファイルはある程度予測可能です。ほとんどの行 (具体的には 99.8%) は、次のパターンに一致します。

# [Timestamp]                  [Thread]  [Event]   [Message]
# TIME:2010/08/25-12:00:01:945 TID: a2c  (VERSION) Managed Assembly version: 2.102.2.20
# TIME:2010/08/25-14:00:02:398 TID:1a60  OpsSqlPrepare2(): SELECT * FROM MyTable
line_regex = /^TIME:(\S+)\s+TID:\s*(\S+)\s+(\S+)\s+(.*)$/

ただし、ログのいくつかの場所では、何らかの理由で複数の行にまたがる複雑なクエリが多数あります。

スクリーンショット

これらのエントリについて注意すべき点が 2 つあります。これは、ログ ファイルが何らかの破損を引き起こしているように見えることです。これは、出力できない文字で終了し、突然次のエントリが同じ行で始まるためです。

これは明らかに行ごとにデータをキャプチャすることを除外しているため、次善の策は「TIME:」という単語と「TIME:」の次のインスタンスまたはファイルの終わりの間のすべてを一致させることだと思います。これを正規表現で表現する方法がわかりません。

より効率的なアプローチはありますか?解析する必要があるログ ファイルは 1.5 GB を超えます。私の意図は、行を正規化し、不要な行を削除して、最終的にクエリ用のデータベースに行として挿入することです。

ありがとう!

4

2 に答える 2

2

"TIME:" と "TIME:" の文字列の間、またはファイルの末尾にある可能性のある複数行のデータに一致する正規表現は次のとおりです。

/^TIME:(.+?)(?=TIME:|\z)/im

一方、ジェームズが言及しているように、「TIME:」部分文字列のトークン化、または「\r\nTIME:」の部分文字列位置の検索 (改行形式に応じて、最初の「TIME:」エントリの後) がより良いと証明される場合があります。アプローチ。

于 2010-08-27T18:40:21.300 に答える
1

この昔ながらの方法、つまり、一度に 1 行ずつファイルを読み取る方が良いかもしれません... 最初の 'TIME' から開始し、次の 'TIME' に到達するまで行を連結します... 使用できます正規表現を使用して、不要な行を除外します。

Ruby と話すことはできません。もちろん、 C# ではStreamReader、ファイル サイズを処理するのに役立つ になります。

于 2010-08-27T17:00:55.147 に答える