我有一个用户会话日志,每个会话由两个用户ID唯一定义。附图是这样一个log->
的样本
我需要检索这些行,其中几个用户之间建立了几个连续的会话,并且这些用户在这些会话之间没有与其他用户通信。会话之间的最大间隔也有一个条件 - 上一个会话的结束时间和下一个会话的“开始时间”之间的时间不应超过75秒。
通过绿色我标记了具有连续会话的用户ID(与其他用户之间没有会话),最棘手的是A和B用户都可以发起会话,我需要全部找到它们。 通过红色我标记了当相同用户建立两个会话时的情况,但是当用户1632300508与某些第三方用户 - 1752301123连接之前,它们似乎不是连续的,而是在回拨到1522909598之前。 - 这种情况不应该是选择。 我非常感谢你的帮助!
答案 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秒。