使用相同的用户查找几个连续的会话

时间:2013-06-01 19:09:34

标签: perl

我有一个用户会话日志,每个会话由两个用户ID唯一定义。附图是这样一个log->

的样本

log image

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

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

1 个答案:

答案 0 :(得分: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秒。