2

ユーザーのセッションのログがあります。各セッションは、一意の 2 つのユーザー ID によって定義されます。添付の写真はそのようなログのサンプルです->

ログ画像

数人のユーザーが互いにいくつかの連続したセッションを確立し、それらのユーザーがこれらのセッション間で他のユーザーと通信しなかった行を取得する必要があります。また、セッション間の最大間隔には条件があります。前のセッションの終了時間と次の「開始時間」の間の期間は 75 秒を超えてはなりません。

連続したセッション (その間に他のユーザーとのセッションがない) を持つユーザー ID を緑色でマークしました。最も難しいのは、A と B のユーザーの両方がセッションを開始でき、それらすべてを見つける必要があることです。同じユーザーによって確立された 2 つのセッションがあるケースを赤色でマークしましたが、1522909598 にコールバックする前に、ユーザー 1632300508 が何らかのサード パーティ ユーザー (1752301123) に接続しているため、連続していないように見えました。選択されました。どんな助けにも感謝します!

4

1 に答える 1

0
use strict;
use warnings;

use Tie::Handle::CSV;

my $log_file = Tie::Handle::CSV->new('userlog', header => 1);

my %last_contact;

while ( my $log_entry = <$log_file> )
   {
   my $userA = $log_entry->{'userA'};
   my $userB = $log_entry->{'userB'};  
   my $start = $log_entry->{'start-time'};
   my ($h,$m,$s) = split /:/, $start;
      $start      = $h * 3600 + $m * 60 + $s;
   my $end       = $log_entry->{'start-time'};
   my ($h,$m,$s) = split /:/, $end;
      $end       = $h * 3600 + $m * 60 + $s        

   if (  ( $last_contact{ $last_contact->{user}->{$userA} } eq $userA )
      && defined $last_contact{ $userA }->{'finish'}
      && ( $last_contact{ $userA }->{'finish'} - $start < 75 ))
      {
      print "Users $userA and $userB have consecutive sessions in less than 75 seconds\n";
      }
   else
      {
      $last_contact{$userA}->{'user'}   = $userB;
      $last_contact{$userA}->{'finish'} = $end;
      $last_contact{$userB}->{'user'}   = $userA;
      $last_contact{$userB}->{'finish'} = $end;
      }
   }

したがって、キーがユーザーで値が最後の連絡先であるハッシュを使用します。ユーザーの最後の連絡先がキーとして使用され、最初のユーザーを指す場合、それらは最後の連絡先であり、何らかのアクションを実行します (ここではその事実を出力します)。それ以外の場合は、2 人のユーザーを取り、最後の連絡先をお互いに設定します。

時間を追跡し、75 秒未満であることを確認するように編集しました。

于 2013-06-01T19:32:38.563 に答える