-2

以下の形式のテキストファイルから読み取っています。

0.000 ff:dd ff:ff 4 126 48000  
0.001 sd:fg er:sd 5 125 67000  
0.002 qw:er ff:dd 5 127 90000  
0.003 xc:sd ff:dd 5 127 90000  
0.004 io:uy gh:ij 4 126 56000  

4 列目の 4 はリクエストを示し、5 はレスポンスを示します。その行がリクエストを表す場合、2番目の列をキーとして辞書を作成する必要があります。
4 番目の列の値が 5 の場合、その行が応答に対応していることを示します。この場合、その応答の 3 列目を見て、その 3 列目が辞書キーとして存在する場合は、その対応するキーの値として 2 列目を追加します。

上記の例では、望ましい結果は次のとおりです。

{'ff:dd': 1, 2, 48000, qw:er, xc:sd}, {'io:uv': 1, 0, 56000}  

ff:dd の場合、1 は ff:dd からの要求が 1 つしかないことを示します。2 は ff:dd に対する 2 つの応答があることを示し、48000 は ff:dd に対応する要求の 6 列目の値です。質問を理解していただければ幸いです。ご不明な点がございましたらお問い合わせください。
io:uv の場合、応答がないため、1 は要求の数を示し、0 は応答の数を示し、56000 はこの要求の 6 列目の値です。
私はネットワーク トラフィックを分析するためにこれらすべてを行っています。

値を動的に追加する方法がわかりません。値の数が固定されていればなんとかなりますが、これは難しい状況です。私はpython2.6を使用しています。助けていただければ幸いです。前もって感謝します!

4

3 に答える 3

0

キーが文字列で、値が (リクエスト、レスポンス、6 列目、[レスポンス キーのリスト]) を含むタプルであるディクショナリを使用します。

于 2013-06-21T18:59:32.257 に答える
0

物事を簡単にするデータ構造を試してみましょう。

私の理解が正しければ、これらのアドレスを辞書のキーにして、これらのキーの下に格納するデータを次のようにしたいでしょう:

  • このアドレスから送信されたリクエストの数
  • このアドレスで受信したリクエストの数
  • このアドレスにリクエストを送信したアドレスのリスト

これはおそらく次のようにフォーマットするのが最善でしょう:

{address:[sent, recv, [address, address, ...]], ...}

したがって、次のようにテキスト ファイルを読み取ることができます。

with open('myfile.txt', 'r') as myfile:
    dct = {}
    for line in myfile:
        splt = line.split()

これで、ファイル内のすべての行を繰り返し処理し、列ごとに分割しています。次に、それがリクエストかレスポンスかを判断したいと思います。

        if splt[3] == '4': # request
            # we're about to fill this in
        elif split[3] == '5': # response
            # we're about to fill this in

'4'これは、またはのいずれかの 4 番目の列をチェックします'5'。そこに別の値があると、問題が発生します (つまり、フォーマットが不十分なデータがあります)。

ここで、リクエストを処理する場合は、次のようにします。

            if splt[1] not in dct:
                dct[splt[1]] = [1, 0, []]
            else:
                dct[splt[1]][0] += 1

これにより、送信されたリクエストの数が 1 増加します。アドレスがまだ辞書にない場合は、追加します。ここで使用splt[1]するのは、受信者ではなく送信者のアドレスについて話しているためです。

もちろん、応答を処理している場合は、別の方法で行動します。ここでは、最初に要求が行われるまで応答を送信しないことを前提としています...しかし、念のため、そのケースをそこに入れ、pass無視します。その上で何をしたいのかを理解するのはあなた次第です...

            if splt[2] not in dct:
                pass
            else:
                dct[splt[2]][1] += 1
                if splt[1] not in dct[splt[2]][2]:
                    dct[splt[2]][2].append(splt[1])

ここでは、受信した応答の数を 1 増やし、応答者のアドレスをリストに追加します。splt[2]送信者のアドレスではなく、受信者のアドレスについて話しているため、代わりに をキーとして使用します。

これは、あなたが達成しようとしていることの核心であるべきです - 私は 4 番目と 5 番目の列が何をするのか理解していないので、それらを省略しました.

于 2013-06-21T22:07:29.520 に答える