Hallo Community,
Ich habe folgendes Problem:
Die Qualität von Daten soll überprüft werden. Dafür sollen die Daten mit einem Refernzdatensatz verglichen werden und ein Qualitätsflag
(im Code QV) bekommen der sagt ob der jeweilige Wert "gut" oder "schlecht" ist. Die Daten liegen in einem 2 dim Feld vor und sind nach Zeit, Tiefe,
und Parameter aufgeteilt (Teil vom Code):
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Aufspalten der Parameter (Headerzeile) in Spalten
(@Cruise_Zeile) = split(/ /,$Cruise_Zeile_ges);
for ($i=0;$i<=$#Cruise_Zeile;$i++){
print $i," ",$Cruise_Zeile[$i],"\n";
}
#suchen der wichtigen Parameter (Tiefe, Datum, Wert)
for ($i=0;$i<=$#Cruise_Zeile;$i++) { if ($Cruise_Zeile[$i] =~ /Depth /) {last} }
$D_spalte=$i; ##### TIEFE######
$D_QV=$D_spalte+1;
# die Zeitspalte steht 2 Spalten vorher!
$Z_spalte=$D_spalte-2; ######## DATUM/ZEIT (Format 2009-01-21T11:00:00) #########
# Suchen nach den Parametern
for ($i=$D_QV;$i<=$#Cruise_Zeile;$i++) { if ($Cruise_Zeile[$i] =~ /Temperature/) {$temp_index=$i;last} }
for ($i=$D_QV;$i<=$#Cruise_Zeile;$i++) { if ($Cruise_Zeile[$i] =~ /Salinity/) {$sali_index=$i;last} }
# aus @aktzeile ein 2-dim Feld machen
foreach (@stationsdaten) {
$zz=$_;
@hilf = split(/ /,$zz);
push(@aktzeile , [@hilf] );
}
######Zeitreihen fuer die einzelnen Parameter basteln
# TEMPERATUR
for ($l=0;$l<=$#stationsdaten;$l++) {
# die Zeitreihe der Temperaturen befindet sich in
push(@zr_temp,$aktzeile[$l][$temp_index]);
}
# Schleife durch alle Parameter machen und die QVs setzen
# aktzeile wird immer komplett mit reingegeben
# ZEIT TIEFE WERT
@QV_neu=sub_QC_temp($Z_spalte,$D_spalte,$temp_index);
for ($l=0; $l<=$#stationsdaten; $l++) {$aktzeile[$l][$temp_index+1]=$QV_neu[$l]}; # neue QVs setzen
# wegschreiben der Zeilen,
# vorher wurden die neuen QVs eingesetzt
for ($i=0;$i<$#stationsdaten;$i++) {
for ($l=0;$l<=$#Cruise_Zeile; $l++) {
printf OUT_DATEI "%+s\t", $aktzeile[$i][$l];
}
printf OUT_DATEI "%+s\n", $aktzeile[$#stationsdaten][$#Cruise_Zeile];
}
close OUT_DATEI;
########## ende MAIN #################
#########EINLESEN DES REFERNZDATENSATZ und splitten nach Parameter (er liegt in folgender Struktur vor:)
#Param Tiefe Monat mean N Sigma Min Max
# TEMP; 2; 01; 4.18; 4235; 1.45; 0.73; 7.07
# TEMP; 2; 02; 2.70; 4056; 1.29; 0.14; 5.35
# TEMP; 2; 03; 2.40; 5135; 1.30; 0.19; 5.22
open(EINGANG,'<'.$dest_dir.$filename ) || die "can't open $filename: $!\n";
my ($bla, @klimatol);
while(<EINGANG>) {
$bla++ if /^\s/;
push @klimatol, $_ if $bla;
}
print @klimatol, "\n";
my @datenz=();
foreach (@klimatol) {
chomp $_; $_=~ s/ //g;
($Param,$Tiefe,$Monat,$mean,$N,$sigma,$Min,$Max)=split(/;/);
push(@datenz,join(';',$Param,$Tiefe,$Monat,$mean,$N,$sigma,$Min,$Max, "\n"));
}
close EINGANG;
Ab hier hier komme ich nicht mehr weiter. Es soll der richtige Wert aus dem
Referenzdatensatz (Monat,Tiefe,Wert) gesucht werden und mit dem Messwert verglichen werden. Beispiel: Wenn der Wert, gemessen im Monat 1 (Januar) kleiner ist als 0.73 oder größer als 7.07 dann bekommt er einen bestimmten flag. Wie kann man aus dem Referenzdatensatz automatisch die richtige Werte
rauspicken (Tiefe, Monat, Min, Max)??????
### SubRoutines Qualitätsüberprüfung
sub sub_QC_temp {
my $zeit_index=$_[0];
my $tiefe_index=$_[1];
my $wert_index=$_[2];
@QV=();
# Beispiel Temperatur
for ($i=0;$i<=$#stationsdaten;$i++) {
if ($aktzeile[$i][$temp_index] < !!!!!Min-Wert aus Referenzdatensatz || $aktzeile[$i][$temp_index] > !!!!!Max-Wert aus Referenzdatensatz ) { $QV[$i]=4 } else {$QV[$i]=2}
}
return @QV;
}
Vielen Dank schonmal im voraus