2016-07-23 81 views
0

我有一個下面的修復文件,我想知道同時發送了多少個訂單。我使用標籤52作爲發送時間。如何計算散列值中發生的次數

下面是文件,

8 = FIX.4.2 | 9 = 115 | 35 = A | 52 = 20080624-12:43:38.021 | 10 = 186 |

8 = FIX.4.2 | 52 = 20080624-12:43:38.066 | 10 = 111 | 8 = FIX.4.2 | 9 = 105 | 35 = 1 | 22 = BOO | 52 = 20080624-12:43:39.066 | 10 = 028 |

如果我要計數標籤52值的相同發生次數是多少?我該如何檢查?

到目前爲止,我已經寫了下面的代碼,但沒有給我頻率。

#!/usr/bin/perl 

$f = '2.txt'; 
open (F,"<$f") or die "Can not open\n"; 
while (<F>) 
{ 
     chomp $_; 
     @data = split (/\|/,$_); 
     foreach $data (@data) 
     { 
       if ($data == 52){ 
       @data1 = split (/=/,$data); 
       for my $j (@data1) 
       { 
         $hash{$j}++; 
       } for my $j (keys %hash) 
         { 
           print "$j: ", $hash{j}, "\n"; 
         } 

       } 
     } 
} 
+0

數據文件中每對記錄之間是否真的有空行? – Borodin

回答

-1

這裏是你的代碼更正:

#!/usr/bin/perl 

$f = '2.txt'; 
open (F,"<$f") or die "Can not open\n"; 
my %hash; 
while (<F>) { 
    chomp $_; 
    @data = split (/\|/,$_); 
    foreach $data (@data) { 
     if ($data ~= /^52=(.*)/) { 
      $hash{$1}++; 
     } 
    } 
} 
for my $j (keys %hash) { 
    print "$j: ", $hash{j}, "\n"; 
} 

說明:

  1. if ($data == 52)整場對抗值52,而不是一個領域的子字符串進行比較。當然,你沒有這樣的領域,測試總是失敗。我用正則表達式比較替換它。

  2. 相同的正則表達式提供了立即捕獲時間戳的機會,而不需要再次拆分字段。它由(.*)在正則表達式中完成,$1在以下分配中完成。

  3. 爲每一行輸入數據輸出散列(您的代碼在foreach循環內輸出它)幾乎毫無意義。我把它放下了。但是,也許,輸出每行的當前散列是你想要的,我不知道。

+0

謝謝你的回答。但是,當我運行代碼時,它不會給我每次發生的確切頻率。相反,它只打印散列值。我試圖得到每次出現的頻率。下面是我運行代碼時得到的o/p。 20080624-12:43:38.021: 20080624-12:43:38.066: 20080624-12:43:39.066: – Efficasy

+0

您可以添加持有事件總數標量計數器,同時增加它時間'$ hash {$ 1}',最後用這個計數器除以$ hash {$ j}'。 –

+0

非常感謝!讓我工作如何添加計數器。 – Efficasy

相關問題