2016-07-23 2 views
0

私は以下の修正ファイルを持っていると私は同時に送信されますどのように多くの注文を知りたいハッシュ値にoccurancesの数をカウントします。私はタグ52を送信時刻として使用しています。はどのように

以下

、ファイルである

8 = FIX.4.2 | = 115 9 | 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 | = 105 9 | = 1〜35 | 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

あなたのansをありがとう。しかし、私がコードを実行すると、それは私にそれぞれの発生の正確な頻度を与えません。その代わりにハッシュ値だけを表示します。私はそれぞれの出現の頻度を取得しようとしています。以下は、コードを実行するときに得られる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