#!/usr/bin/perl #=============================================================================== # # FILE: collate.pl # # USAGE: ./collate.pl # # DESCRIPTION: Put all the _Detail reports into a single csv # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Andrew Fresh (AAF), andrew@afresh1.com # COMPANY: Red River Communications # VERSION: 1.0 # CREATED: 10/07/11 17:26:05 # REVISION: --- #=============================================================================== use strict; use warnings; use 5.010; use Text::CSV_XS; use File::Find; my %wanted_keys = ( Latency => [ 'TxFrames', 'RxFrames', 'LostFrames', 'MinLatency', 'AveLatency', 'MaxLatency', 'StdDeviation', '<=50 uSec', '<=100 uSec', '<=250 uSec', '<=500 uSec', '<=750 uSec', '<=1000 uSec', '<=1500 uSec', '<=2000 uSec', 'InSequence', 'OutOfSequence', 'Tx fps', 'Rx fps', 'Tx L2 bps', 'Rx L2 bps', 'Rx L3 bps', ], Throughput => [ 'TxFrames', 'RxFrames', 'LostFrames', 'Lost (%)', 'Throughput', 'Tx fps', 'Rx fps', 'Tx L2 bps', 'Rx L2 bps', 'Rx L3 bps', ], Frame_Loss => [ 'TxFrames', 'RxFrames', 'LostFrames', 'Lost (%)', 'InSequence', 'OutOfSequence', 'Tx fps', 'Rx fps', 'Tx L2 bps', 'Rx L2 bps', 'Rx L3 bps', ], ); my $csv = Text::CSV_XS->new(); my %data; find( \&wanted, './' ); $csv->eol("\n"); while ( my ( $type, $d ) = each %data ) { say $type; my $keys = $wanted_keys{$type}; open my $fh, '>', $type . '.csv' or die "$type: $!"; $csv->print( $fh, [ 'arch', 'kernel', 'nic', 'size', 'load', @{$keys} ] ); foreach my $arch ( sort keys %{$d} ) { foreach my $kernel ( sort keys %{ $d->{$arch} } ) { foreach my $nic ( sort keys %{ $d->{$arch}{$kernel} } ) { foreach my $size ( sort { $a <=> $b } keys %{ $d->{$arch}{$kernel}{$nic} } ) { foreach my $load ( sort { $a <=> $b } keys %{ $d->{$arch}{$kernel}{$nic}{$size} } ) { $csv->print( $fh, [ $arch, $kernel, $nic, $size, $load, @{ $d->{$arch}{$kernel}{$nic}{$size}{$load} }{ @{$keys} } ] ); } } } } } close $fh; } sub wanted { return unless /\.csv$/; my ( undef, $arch, $kernel, $nic ) = split '/', $File::Find::dir; my @keys; open my $fh, '<', $_ or die "$_: $!"; while ( my $row = $csv->getline($fh) ) { if ( !@keys ) { @keys = @$row; next; } next unless $row->[0] eq 'Total'; my $type = 'Other'; given ($_) { when ('Throughput_Detail.csv') { $type = 'Throughput' } when ('Frame Loss_Detail.csv') { $type = 'Frame_Loss' } when ('Jumbo_Detail.csv') { $type = 'Latency' } when ('Latency Distribution_Detail.csv') { $type = 'Latency' } when ('Latency_Detail.csv') { $type = 'Latency' } } my %row; @row{@keys} = @$row; my $FrameSize = delete $row{FrameSize}; my $ILoad = delete $row{ILoad}; $data{$type}{$arch}{$kernel}{$nic}{$FrameSize}{$ILoad} ||= {}; %{ $data{$type}{$arch}{$kernel}{$nic}{$FrameSize}{$ILoad} } = ( %{ $data{$type}{$arch}{$kernel}{$nic}{$FrameSize}{$ILoad} }, %row ); } $csv->eof or $csv->error_diag(); close $fh; }