@VFederoff

Задачка по обработке CSV файла. Как подсчитать среднее значение?

Имею неотсортированный CSV файл с таким содержанием:

ClassA1,mark,chemistry,5
ClassA2,mark,philosofy.5
ClassA2,julia,physic,5
ClassA1,julia,math,3
ClassA1,mark,philosophy, 5
ClassA1,julia,chemistry,4
ClassA2.mark,chemistry,4
ClassA2,julia,literature,2
...
где
$класс,$имя_ученика,$предмет,$оценка

Подскажите каким образом с помощью сценария на perl лучше всего подсчитать средний балл по всем предметам для всех учеников разных классов? Например для ученика mark из класса ClassА1 это:
ClassA1,mark,chemistry,5
+
ClassA1,mark,philosophy, 5
=
10/2 =5

а для ученика mark из ClassA2 это:
ClassA2,mark,philosofy.5
+
ClassA2.mark,chemistry,4
= 9/2 = 4.5


Буду рад вашим советам. Спасибо.
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 2
@pcdesign
Если на коленке и без использования всяких модулей, то можно вот так:

use strict;
use warnings;
use utf8;

my $csv = <<'EOF';
ClassA1,mark,chemistry,5
ClassA2,mark,philosofyr,5
ClassA2,julia,physic,5
ClassA1,julia,math,3
ClassA1,mark,philosophy,5
ClassA1,julia,chemistry,4
ClassA2,mark,chemistry,4
ClassA2,julia,literature,2
EOF

my @csv = split "\n", $csv;

my (%sum, %count);
for my $row (@csv) {
    my ( $class, $name, undef, $num ) = split ",", $row;
    my $key = $class . '-' . $name;
    $sum{$key} += $num;
    $count{$key} += 1;
}

for my $name_class ( keys %sum ) {
    print $name_class, $sum{$name_class}/$count{$name_class}, "\n";
}


Результат:
ClassA1-julia3.5
ClassA2-julia3.5
ClassA2-mark4.5
ClassA1-mark5


Хотя можно все это покрасивее и короче написать.
Ответ написан
Комментировать
parserpro
@parserpro
Чую задание по программированию.
Давай-ка сам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы