Thread Mehrere Messungen zu einem Zeitpunkt erkennen und mitteln (12 answers)
Opened by Emilie at 2010-04-12 13:47

murphy
 2010-04-12 15:34
#135900 #135900
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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.

View full thread Mehrere Messungen zu einem Zeitpunkt erkennen und mitteln