我在XML文件中有一堆这样的标签:
<Key Time="47" TT=Xr="485" Yr="311" Yc="183" />
我想获得所有标签中Yc和Yr的总和,最小值,最大值,中值和平均值,以及有限数量的标签(比如第10和30行中的标签)。
是否可以使用Perl执行此操作?
答案 0 :(得分:2)
XML没有行号的概念。要访问XML中的值,请使用像XML::LibXML
这样的XML解析器。
假设您的数据是
<Keys>
<Key Time="47" Xr="485" Yr="311" Yc="183" />
<Key Time="47" Xr="485" Yr="123" Yc="381" />
<Key Time="47" Xr="485" Yr="456" Yc="190" />
<Key Time="47" Xr="485" Yr="322" Yc="182" />
<Key Time="47" Xr="485" Yr="223" Yc="165" />
</Keys>
我们可以像
那样解析它use strict; use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml(string => $the_data);
然后我们可以通过XPath表达式访问属性:
my (@yr, @yc);
for my $key ($xml->findnodes('/Keys/Key')) {
push @yr, $key->findvalue('./@Yr');
push @yc, $key->findvalue('./@Yc');
}
如果您只想访问一定数量的Key
,可以在Perl代码中优化XPath表达式或计数,或者使用切片:
for my $key ( ($xml->findnodes(...))[10..30] ) { ... }
在收集了所有这些值之后,做一些统计数据是微不足道的。
对于sum
,min
和max
,您可以使用List::Util
中的功能。
修改:Statistics::Descriptive
模块非常棒:
use Statistics::Descriptive;
use feature 'say'; # for the "say" function. Available since perl5 v10.
my $yr = Statistics::Descriptive::Full->new();
$yr->add_data(@yr);
say "mean: ", $yr->mean;
say "median: ", $yr->median;
say "min: ", $yr->min;
say "max: ", $yr->max;
say "sum: ", $yr->sum;
可以从CPAN轻松安装此模块。