Thread Mehrere Messungen zu einem Zeitpunkt erkennen und mitteln
(12 answers)
Opened by Emilie at 2010-04-12 13:47
Hat es eigentlich irgendeinen speziellen Sinn, dass die Datei einen Unixtimestamp und ein Datum enthält? Diese Kombination von Informationen ist auf jeden Fall redundant.
Wie dem auch sei, ich würde, wie andere schon vorgeschlagen haben, einen Hash verwenden um identische Zeitstempel abzufangen, die Zeilen lieber nicht mit substr sondern mit split zerlegen und eine generische Infrastruktur aufbauen um mehrere Messwerte auf einen zu reduzieren. Kleines Beispiel: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #!/usr/bin/perl use 5.010; use strict; use warnings; # Data reducer collecting values in a list my $collect = { init => [], step => sub { [ @{$_[0]}, $_[1] ] }, fini => sub { '[' . join(', ', @{$_[0]}) . ']' } }; # Data reducer averaging numerical values my $average = { init => [ 0, 0 ], step => sub { [ $_[0]->[0] + 1, $_[0]->[1] + $_[1] ] }, fini => sub { $_[0]->[1] / $_[0]->[0] } }; # Mapping from field indices to data reducers my @reducers = ( $collect, $collect, $average, $average, $average, $average ); # Read data my %data = (); while (<DATA>) { my ($stamp, $d, $m, $y, @fields) = split /\s+/; push @{$data{$stamp}}, \@fields; } # Reduce and print data foreach my $stamp (sort keys %data) { my @accumulators = map { $_->{init} } @reducers; foreach my $fields (@{$data{$stamp}}) { @accumulators = map { $reducers[$_]->{step}->($accumulators[$_], $fields->[$_]) } $[ .. $#reducers; } @accumulators = map { $reducers[$_]->{fini}->($accumulators[$_]) } $[ .. $#reducers; say join("\t", $stamp, @accumulators); } __DATA__ 1094000940 01 09 2004 N49390 E009202 12360 -3 320 017 1094000940 01 09 2004 N49410 E009203 11650 -2 305 016 1094000940 01 09 2004 N49431 E009204 11120 -2.5 339 016 1094001000 01 09 2004 N49451 E009205 10990 -2.2 325 018 1094001000 01 09 2004 N49470 E009199 10460 -1.5 291 018 1094001000 01 09 2004 N49489 E009184 9550 -5.2 250 010 When C++ is your hammer, every problem looks like your thumb.
|