2013-06-01 59 views
2

我有用戶會話的日誌,每個會話由兩個唯一的用戶ID定義。附加的圖片是這樣的對數的樣本>查找與同一用戶的多個連續會話

log image

我需要檢索其中幾個用戶建立彼此之間連續幾個會話那些線和這些用戶不與之間其他用戶通信這些會議。此外,會話之間的最大時間間隔也是有條件的 - 上一次會話的結束時間與下列時間的「開始時間」之間的時間不應超過75秒。

綠色我標記了連續會話的用戶ID(與其他用戶之間沒有會話),最棘手的是A和B用戶都可以發起會話,我需要全部找到它們。 紅色我標記的情況下,當有兩個會話由同一用戶建立,但它們似乎不是連續的,因爲用戶1632300508與一些第三方用戶連接 - 1752301123在調用回1522909598之前 - 此類情況不應該被選中。 我會非常感謝您的幫助!

回答

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秒。