2

我有一个用户会话日志,每个会话由两个唯一的用户 ID 定义。所附图片是此类日志的示例->

日志图像

我需要检索几个用户在彼此之间建立了几个连续会话并且这些用户在这些会话之间没有与其他用户通信的那些行。会话之间的最大间隔也有一个条件 - 前一个会话的完成时间和下一个会话的“开始时间”之间的时间不应超过 75 秒。

我用绿色标记了具有连续会话的用户 ID(之间没有与其他用户的会话),最棘手的是 A 和 B 用户都可以发起会话,我需要找到它们。我用红色标记了同一用户建立了两个会话的情况,但它们似乎不连续,因为用户 1632300508 与某些第三方用户连接 - 1752301123 在回拨到 1522909598 之前。 - 这种情况不应该选择。我将非常感谢您的帮助!

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;
      }
   }

所以,我会使用一个哈希值,它的键是用户,值是他们的最后一次联系。如果用户的最后一个联系人被用作键并指向第一个用户,那么他们就是他们的最后一个联系人,你需要采取一些行动(这里我只是打印出这个事实)。否则,将这两个用户设置为彼此的最后联系人。

编辑以跟踪时间并确保它低于 75 秒。

于 2013-06-01T19:32:38.563 回答