Perl中最简单的代码是什么,它可以通过CSV文件并创建数学计算?
更具体:
我有一个包含以下内容的CSV文件:
Input Execution Output Total
608 124800 1856 127264
512 124960 1920 127392
864 124992 1888 127744
我想计算每列的标准偏差。 (对于input \ exection \ output \ total)
我们假设此文件位于:myDocuments\me\info.csv
我成功编写了一个循环csv文件并计算列Input标准偏差的函数。但是如果我希望它是一个通用函数,我可以从代码中的几个地方调用,接收一个字符串,如“输入”或“执行”,函数应该对其进行计算 - 我该怎么做? / p>
答案 0 :(得分:1)
这将满足您的需求
use strict;
use warnings;
use List::Util 'sum';
my @data;
while (<DATA>) {
push @data, [ split ];
}
my $headers = shift @data;
my $n = @data;
for my $i ( 0 .. $#{$data[0]} ) {
my $mean = sum(map $_->[$i], @data) / $n;
my $stddev = sqrt(sum(map { ($_->[$i] - $mean) ** 2 } @data) / $n );
printf "%-9s: Mean %.3f, Standard Deviation %.3f\n",
$headers->[$i], $mean, $stddev;
}
__DATA__
Input Execution Output Total
608 124800 1856 127264
512 124960 1920 127392
864 124992 1888 127744
<强>输出强>
Input : Mean 661.333, Standard Deviation 148.569
Execution: Mean 124917.333, Standard Deviation 83.989
Output : Mean 1888.000, Standard Deviation 26.128
Total : Mean 127466.667, Standard Deviation 202.947
答案 1 :(得分:0)
大多数人只是使用split
来解决问题,但是已经存在快速且健壮的wheel用于解析和生成CSV(以及制表符分隔数据)。
但你问的是什么以及你看到的东西是不同的东西。您发布的内容不是CSV,Text :: CSV_XS不会这样做。但实际上,这很简单。
您可以使用
解析该行my @fields = split(' ', $line);
您可以使用
重新创建文件(如有必要)printf($fh "%-11d %-15d %-7d %d\n", @fields);
所以你的问题不是关于任意列的操作。这意味着您需要拥有可以按名称访问的数据列。那叫喊数组的哈希值。
my $headers = <$fh>;
my @headers = split ' ', $header;
my %data;
while (<$fh>) {
my @row = split;
for (0..$#header) {
push @{ $data{ $headers[$_] } }, $row[$_];
}
}
some_func( @{ $data{Execution} } );
答案 2 :(得分:0)
the function is:
sub parse_standard
{
my $filename = "myDocuments\\me\\info.csv";
#first, calculate the Avg and the number of rows
open(INPUT, $filename) or die "Cannot open $filename";
# Read the header line.
my $line = <INPUT>;
my $sum = 0 ;
my $counter = 0;
#Read the lines one by one.
while($line = <INPUT>)
{
chomp($line);
my ($Input,$Execution,$Output,$Total,$SelfTest,$Log_Location,$Log_Name) = split(',', $line);
$sum = $sum + $Input;
$counter = $counter +1;
}
$avg = $sum / $counter ;
#second , calculate the standard deviation
open(INPUT, $filename) or die "Cannot open $filename";
my $line = <INPUT>;
my $sum = 0 ;
#Read the lines one by one.
while($line = <INPUT>)
{
chomp($line);
my ($Input,$Execution,$Output,$Total,$SelfTest,$Log_Location,$Log_Name) = split(',', $line);
$diff = ($Input-$avg);
$square = $diff * $diff ;
$sum = $sum + $square;
}
$tosqrt = $sum / $counter;
$answer = sqrt($tosqrt);
print "standard deviation is $answer\n";
close(INPUT);
}
parse_standard();