Perl求中值
发布时间:2020-12-16 00:19:55 所属栏目:大数据 来源:网络整理
导读:先就按这个标题了吧,其实是求数据的中值,如果不合适请大家见谅 参考数据,感谢网友提供的资料 http://perldoc.perl.org/perllol.html http://blog.sina.com.cn/s/blog_5f8e03960100wq3r.html 大晚上的,闲来无事,碰巧遇到一批数据需要处理,就拿学习中的P
先就按这个标题了吧,其实是求数据的中值,如果不合适请大家见谅 参考数据,感谢网友提供的资料 http://perldoc.perl.org/perllol.html 程序想要实现的功能本来挺简单的,可由于水平限制,还是折腾了几个小时。 感觉自己还是花了精力和时间,发博文来给大家分享。欢迎批评指正。 源码中注释不明的地方,请留言指出,谢谢! 程序源码如下(参考资料已在博文前面注明,源码是本人自己写的,如果有小部分与网上相同,这个是不能避免的小概率事件) #!usr/bin/perl -w use strict; use 5.014; # 更改为你的Perl版本 ### powered by Nan Zhou .AT. Sichuan university ### version 0.0.1 ### last update 01/18/13 die "Usage: perl midpoint.pl FileInName FileOutName" unless scalar @ARGV == 2; open IN,"<",$ARGV[0] or die "read file errorn"; open OUT,">",$ARGV[1] or die "out file errorn"; print "Is the first line introduction line?(Yes/No) "; # 你文件中的第一行是说明行么 chomp(my $check=<STDIN>); my @aoa_all=(); # 建立二维数组,用以存放原文件所有信息 while(<IN>){ chomp; if('Yes' =~ /$check/i){ #第一行是说明行,先输出到文件,剩下的行用来放到二维数组 say OUT; $check = 'No'; next; } my @tmp_line=split /t/; push @aoa_all,[@tmp_line]; } # 数组初始化完成,这是一个X行,Y列的二维数组 my $cols_index=$#{$aoa_all[0]}; # 注意:是Y列的下标,不是元素个数。方便后面按*列*处理数据 # my $cols=$cols_index+1; for my $index_of_aoa (0 .. $#aoa_all){ # 从二维数组首行到末行 next if $aoa_all[$index_of_aoa][0] eq 'Done'; # 'Done'是用来作为标记的,防止重复处理已处理的 my @lines_index_record=$index_of_aoa; # 比如首行首元素为'p001',找到所有其他首元素为'p001'的行号,并记录 for my $re_index_of_aoa ($index_of_aoa+1 .. $#aoa_all){ next if $aoa_all[$re_index_of_aoa][0] eq 'Done'; if ($aoa_all[$re_index_of_aoa][0] eq $aoa_all[$index_of_aoa][0]){ push @lines_index_record,$re_index_of_aoa if $aoa_all[$re_index_of_aoa][0] eq $aoa_all[$index_of_aoa][0]; $aoa_all[$re_index_of_aoa][0]='Done'; } } # 寻找行完成。比如,所有首元素为'p001'的行索引都找到并记录了 print OUT "$aoa_all[$index_of_aoa][0]t"; # 输出标记。比如输出'p001',下面接着在后面输出'p001'的值,其实就是为了方便查看 for my $cur_col (1 .. $cols_index){ # loop all cols. Note,it's 1,not 0,cause col 0 isn't value my @col_values=(); # 比如,已经找到了'p001'的行索引,按列处理,保存某行所有列值到数组 #for my $cur_line (@lines_index_record){ # 符合条件的列,比如'p001' # push @col_values,$aoa_all[$cur_line][$cur_col]; # 在二维数组中去某行某列的值 #} map { push @col_values,$aoa_all[$_][$cur_col] } @lines_index_record; # 上面取值的另外一种实现方式 # 算中值 my $midpoint=-100; my @sort_col_values=sort { $a <=> $b } @col_values; if(@col_values%2==0){ $midpoint=($sort_col_values[@col_values/2-1]+$sort_col_values[@col_values/2])/2; }else{ $midpoint=$sort_col_values[$#col_values/2]; } # 计算完成 print OUT "$midpointt"; #输出 } print OUT "n"; } say "Done!"; 没找到Perl源码嵌入格式,用python了@_@ 花絮: 附上本人‘算法’涂鸦,见图2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |