1

テキスト ファイルを解析する最も効率的な方法を知りたいです。たとえば、次のテキスト ファイルがあるとします。

接続サーバーの数: 1

サーバーのステータス: ACTIVE

サーバーへの接続数: 4

サーバーのステータス: ACTIVE

サーバーが応答していません: 13:25:03

サーバー接続が確立されました: 13:27:05

私がやりたいことは、ファイルを調べて情報を収集することです。たとえば、サーバーへの接続数やサーバーがダウンした回数などです。これらの値をリストに保存して、後で表示またはプロットできるようにします。

次のようにリストにキーワードがあると仮定すると、これを実行する最良の方法は何ですか。

referenceLines = ['connections server', 'Server status', 'not responding']

リストには完全な文はなく、その一部しかないことに注意してください。ファイルを 1 行ずつ調べて、読み取った行が referenceLines リストのいずれかのエントリに対応しているかどうかを確認します。対応している場合は、リスト エントリのインデックスを取得し、対応する関数を呼び出します。

典型的なテキスト ファイルのサイズは約 50MB になるため、これを行うための最も効率的な (時間、メモリ) 方法は何でしょうか。

ありがとうございました。

どれでも

4

4 に答える 4

4

すべての行が「:」で区切られている場合、文字列を分割できます。

message, value = line.split(': ', 1)
于 2012-05-22T13:04:11.353 に答える
1

実用的なアプローチとして、これを一連のステップで実装し、各ステップでパフォーマンスを測定して、テストデータで使用しているアプローチのコストを測定することをお勧めします。

例えば:

  • ファイルを1行ずつ単純に読み取るのにどのくらい時間がかかりますか?
  • 各行をsplit()すると、どのくらいの時間がかかりますか?
  • 各行でre.match()を実行すると、どのくらいの時間がかかりますか?

最適なソリューションは、使用している参照線の数など、データによって異なりますが、最新のマシンでは数秒しかかかりません。

于 2012-05-22T13:13:33.323 に答える
1

解析するテキスト ファイルに常に同じフィールドが同じ順序で含まれている場合は、mikerobi のソリューションが適しています。それ以外の場合は、行を反復処理して、referenceLines の検出を試みる必要があります...

于 2012-05-22T13:19:03.413 に答える
1

考えられるアプローチの 1 つを次に示します。フォームの正規表現パターンを使用して'keyword1|keyword2'、複数のキーワードを一度に検索します。

def func1(line):
    #do something

def func2(line):
    #do something

actions = {'connections server': func1,
           'Server status': func2}

regex = re.compile('|'.join(re.escape(key) for key in actions))

for line in file:
    for matchobj in regex.finditer(line):
        actions[matchobj.group()](line)
于 2012-05-23T07:11:13.497 に答える