- ベストアンサー
Perl条件付最小値を求める方法と順位の割合計算方法
- Perlを使用して、指定条件の最小値を求める方法と順位の割合を計算する方法について説明します。
- 具体的なデータとして、a.txtというファイルの中から特定の列を取得し、場所Aまたは場所Bでの最小値を求める方法を示します。
- また、場所Aまたは場所Bでの順位が3以上の割合を計算する方法についても説明します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> for ($i=2;$i<=$#DATA2;$i++){ > この部分の$#DATA2 は最終行までということでしょうか? はい、ここは3行目から最終行まで処理を行うということになります。 配列(@DATA2)の最終要素番号を知りたい時に、$#配列名とするとその値を得ることが出来ます。 配列の要素番号は「0」から始まりますので、今回のように各行を配列要素として取り込む場合で100行あったとすると、最終要素番号は「99」になります。 これを踏まえると、3行目から取得するので、$iの最初の値を「2」としていることが理解できると思います。 > もし、行が2~15行だけ取得したいとき、 この場合は forループの$i値を次のようにすることで取得できます。 for ($i=1;$i<=14;$i++){ あるいは for ($i=1;$i<15;$i++){ ※「<=」ではなく、「<」となっている部分に注目。
その他の回答 (1)
- hok212
- ベストアンサー率66% (100/150)
泥臭くやると次のような感じでしょうか。 open(FILE2, "a.txt"); flock(FILE2, 1); @DATA2 = <FILE2>; close FILE2; @placeA = (); @placeB = (); $rankA = 0; $rankB = 0; for ($i=2;$i<=$#DATA2;$i++){ my $data2 = $DATA2[$i]; chomp($data2); my ($B01,$B02,$B03,$B04,$B05,$B06) = split(/\,/, $data2); if ($B02 eq "場所A") { push(@placeA,$B03); if ($B04 <= 3) { $rankA++; } } elsif ($B02 eq "場所B") { push(@placeB,$B03); if ($B04 <= 3) { $rankB++; } } } @sortA = sort(@placeA); print "場所Aの最小値:" . @sortA[0] . "\n"; @sortB = sort(@placeB); print "場所Bの最小値:" . @sortB[0] . "\n"; $Anum = $#placeA + 1; $Bnum = $#placeB + 1; print "場所Aの3位以上の率:"; if ($rankA > 0) { $ritsuA = ($rankA / $Anum) * 100; print $ritsuA . "%\n"; } else { print 0 . "%\n"; } print "場所Bの3位以上の率:"; if ($rankB > 0) { $ritsuB = ($rankB / $Bnum) * 100; print $ritsuB . "%\n"; } else { print 0 . "%\n"; } 小数点以下を任意の桁数で四捨五入したいのであれば、 Math::Roundモジュールを読み込んで、次のように書き換えればOKです。 $ritsuA = ($rankA / $Anum) * 100; ↓ $ritsuA = nearest(0.1, ($rankA / $Anum) * 100); #小数点以下1桁 0.1を0.01にすると小数点以下2桁になります。
お礼
ありがとうございます! ほしい値を取得することができました! for ($i=2;$i<=$#DATA2;$i++){ この部分の$#DATA2 は最終行までということでしょうか? もし、行が2~15行だけ取得したいとき、 15に変えたとして、 $rankA++; この部分で、おかしなことになりますよね・・?
お礼
ありがとうございました! おかげさまでやりたいことができました!