0

CSV ファイルを調べて数学計算を作成できる Perl の最も単純なコードは何ですか?
より具体的に
は、次を含むCSVファイルがあります。

Input       Execution       Output  Total
608         124800          1856    127264
512         124960          1920    127392
864         124992          1888    127744

各列の標準偏差を計算したいと思います。(入力\実行\出力\合計の場合)
このファイルが以下にあると仮定します:myDocuments\me\info.csv

csvファイルをループして、列入力の標準偏差を計算する関数を書くことに成功しました。しかし、関数が計算を行う必要がある「入力」や「実行」などの文字列を受け取るコードのいくつかの場所から呼び出すことができる一般的な関数にしたい場合は、どうすればよいですか?

4

3 に答える 3

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
于 2013-02-25T16:03:18.667 に答える
0

ほとんどの人は を使用してパーサーを作成するだけsplitですが、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} } );
于 2013-02-25T15:52:27.363 に答える
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();
于 2013-02-25T16:15:27.333 に答える