Perl Help ... Читать файл .. делать математику ... записать файл?Новое в Perl - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть файл, который таков:

DATA_SET1
INFO1 INFO2 INFO3 = ### ### ###
INFO4 = ###
INFO5 = ###
INFO6 = ###
INFO7 = ###
INFO8 = ###
DATA_SET2
INFO1 INFO2 INFO3 = ### ### ###
INFO4 = ###
INFO5 = ###
INFO6 = ###
INFO7 = ###
INFO8 = ###
etc...

Мне нужно сделать немного статистики чисел. Пример: среднее число INFO4 из DATASET1, DATASET2 и т. Д. ... Затем я должен записать среднее значение в другой файл:

STATISTICS:
INFO4 Average: ### 

Я ОЧЕНЬ ОЧЕНЬ новичок в PERL. Это, наверное, очень легко сделать, я просто не знаю, с чего начать.

Спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 23 февраля 2011

Сначала вам нужно поместить файл в структуру данных.Примерно так должно работать, если у вас всегда одинаковое форматирование.

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper; # for printing the hash of results at the end

my $file = $ARGV[0]; # Specify the file as first command line argument
open my $fh, '<', $file;

my %data;
my $current_set = 'default';
while(my $line = <$fh>) {
  chomp $line;
  if ($line =~ /(DATA_SET\d+)/) {
    $current_set = $1;
  } elsif ($line =~ /=/) {

    my ($vars, $vals) = split(/\s*=\s*/, $line);

    my @vars = split(/\s/,$vars);
    my @vals = split(/\s/,$vals);

    die "length of variable declarations is not equal to length value declarations" 
      unless (@vars == @vals);

    while (@vars) {
      my $var = shift @vars;
      my $val = shift @vals;
      $data{$current_set}{$var} = $val;
    }
  }
}

print Dumper \%data;

#This assumes that each DATA_SET has an INFO4 term. 
#  N.B. It will assume a zero if not defined!
my @INFO4 = map { $data{$_}{'INFO4'} } keys %data;
die "Nothing to average" unless @INFO4;

my $sum;
foreach (@INFO4) {
  $sum += $_;
}
my $av = $sum / scalar @INFO4;

print "$av\n";

В конце я просто распечатаю созданную структуру данных, вам нужно будет выполнить здесь домашнюю работу, чтобы использовать эту структуру данных (РЕДАКТИРОВАТЬ: Добавлено усреднение по терминам INFO4).perldoc - хорошее место для начала.Также, если вам нужна мощная математика, я хотел бы взглянуть на язык данных Perl (PDL) , который реализует математический язык быстрого массива (подобный Matlab) в Perl.

Удачи.

1 голос
/ 23 февраля 2011

Если вы просто вычисляете средние значения INFO 4, вы, вероятно, можете просто использовать регулярное выражение для определения и разделения этих значений.Вот пример грубого сценария, который вы могли бы использовать, чтобы начать (это не обязательно лучшие практики, но я попытался прояснить, что происходит).Он считывает файл данных и добавляет к среднему значению значение Info 4.(Я использовал подстроку, предполагая, что в вводе данных нет ошибок, но опять же, это просто грубый ответ, который подходит для вашего примера).Вам также может понадобиться использовать sprintf для округления ваших значений по мере необходимости (в настоящее время он будет работать как float).Надеюсь, это поможет.

open (IN, "file.txt") or die "Unable to open input file.\n";
while ($line = ){
    chomp($line);
    if ($line =~ m/INFO4/i){
        $average += int(substr($line, 8,length $line));
        $count++;
    }
}
close (IN);
$average = ($average/$count) if $count > 0;

open (OUT, ">output.txt") or die "Unable to open output file.\n";
print OUT "INF04 Average: $average\n";
close(OUT);
1 голос
/ 22 февраля 2011

Я бы начал здесь Изучение Perl или здесь Программирование Perl и здесь Кулинарная книга Perl , если вы знаете более одного языка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...