从Perl中的CSV文件中获取信息

时间:2013-02-25 15:26:02

标签: perl

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>

3 个答案:

答案 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();