加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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
http://blog.sina.com.cn/s/blog_5f8e03960100wq3r.html

大晚上的,闲来无事,碰巧遇到一批数据需要处理,就拿学习中的Perl来练手了。

程序想要实现的功能本来挺简单的,可由于水平限制,还是折腾了几个小时。

感觉自己还是花了精力和时间,发博文来给大家分享。欢迎批评指正。

源码中注释不明的地方,请留言指出,谢谢!

万语千言,不敌一张图
本程序想要实现的功能,见图1
注1:算中值,比如,'p001'的中值
注2:第一行就是程序中的‘说明行’示例


程序源码如下(参考资料已在博文前面注明,源码是本人自己写的,如果有小部分与网上相同,这个是不能避免的小概率事件)

#!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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读