2016-10-14 13 views
1

一連の数値を含むテキストファイルを読み込んでパーセンタイルに対応する数値を計算して出力するperlコードを作成しようとしています。私は他の統計モジュールにアクセスすることができませんので、純粋なperlコーディングに固執したいと思います。前もって感謝します!Perl:配列を読み込み、対応するパーセンタイルを計算する

入力テキストファイルは次のようになります。

197 
98 
251 
82 
51 
272 
154 
167 
38 
280 
157 
212 
188 
88 
40 
229 
228 
125 
292 
235 
67 
70 
127 
26 
279 
.... (and so on) 

私が持っているコードは次のとおりです。

#!/usr/bin/perl 
use strict; 
use warnings; 

my @data; 

open (my $fh, "<", "testing2.txt") 
         or die "Cannot open: $!\n"; 
while (<$fh>){ 
    push @data, $_; 
} 
close $fh; 

my %count; 
foreach my $datum (@data) { 
    ++$count{$datum}; 
} 

my %percentile; 
my $total = 0; 
foreach my $datum (sort { $a <=> $b } keys %count) { 
    $total += $count{$datum}; 
    $percentile{$datum} = $total/@data; 
    # percentile subject to change 
    if ($percentile{$datum} <= 0.10) { 
     print "$datum : $percentile{$datum}\n\n"; 
    } 
} 

マイ所望の出力:

フォーマットはから番号NUMBERである
2 : 0.01 
3 : 0.01333 
4 : 0.01666 
6 : 0.02 
8 : 0.03 
10 : 0.037 
12 : 0.04 
14 : 0.05 
15 : 0.05333 
16 : 0.06 
18 : 0.06333 
21 : 0.07333 
22 : 0.08 
25 : 0.09 
26 : 0.09666 

リスト:#対応するパーセンタイル

+1

あなたのスクリプトの出力は望ましいものとどのように異なっていますか? – choroba

+0

いくつかの奇妙な理由から、左側に何も表示されず(リストの番号)、それに対応する百分位数が表示されます – Kaiser

+0

オフトピック: 'while'-loopを' my @data = <$fh> ' – red0ct

答えて

2

ちょうどあなたがそれらすべてを読んだ後に、またはchomp @data;をプッシュする前chomp;を追加し、@dataで改行wihtout NUMERを格納します。

入力ファイルにMSWinスタイルの改行がある場合は、dos2unixまたはfromdosを使用して* nixスタイルに変換します。

また、あなたのコードをインデントする方法を学習しようとすると、それは読みやすさを向上させます。値が変更されると、$totalから$running_totalに名前変更することを検討してください。

+0

私はchompを追加しましたが、リストの#numberはそれに対応する百分位数とともに印刷されません。 – Kaiser

+1

@サニー:奇妙な、それは私のために働く。 – choroba

+0

@サニー:ああ、更新された答えを確認してください。 – choroba

関連する問題