#! /usr/bin/env perl use v5.10.1; use strict; use warnings; use Carp; use Pod::Usage; use Text::ParseWords; use XML::LibXML; use ACU::Log; use ACU::LDAP; use ACU::Process; our $basedir = "/intradata"; sub process { my $given_args = shift; my @args = shellwords(${ shift() }); my $project_id = shift @args; my $year = shift @args // LDAP::get_year; # Project existing? if (! -d "$basedir/$year/$project_id") { log ERROR, "Unable to find $project_id in $year"; return "Unable to find $project_id in $year\n"; } my %grades; my @headers; opendir(my $dh, "$basedir/$year/$project_id/grades/") or croak "can't opendir $basedir/$year/$project_id/grades/: $!"; for my $gfile (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/grades/$_" } readdir($dh)) { my $login; ($login = $gfile) =~ s/\.xml$//; open my $xml, "<", "$basedir/$year/$project_id/grades/$gfile" or die $!; binmode $xml; my $dom = XML::LibXML->load_xml(IO => $xml); close $xml; my @ugrades = @headers; for my $grade ($dom->documentElement()->getElementsByTagName("grade")) { my $i; for ($i = 0; $i <= $#ugrades; $i++) { if ($ugrades[$i] == $grade->getAttribute("name")) { $ugrades[$i] = $grade->getAttribute("value"); last; } } if ($i > $#ugrades) { push @headers, $grade->getAttribute("name"); push @ugrades, $grade->getAttribute("value"); } } $grades{$login} = \@ugrades; } closedir $dh; # Print CSV my $out = "login"; for my $header (@headers) { $out .= ",$header"; } $out .= "\n"; for my $login (keys %grades) { $out .= "$login"; my @ugrades = @{ $grades{$login} }; for my $header (@headers) { my $g = shift @ugrades; $out .= ","; $out .= $g if ($g && $g ne $header); } $out .= "\n"; } return $out; } Process::register_no_parse("get_csv", \&process);