Schrift
[thread]8942[/thread]

Tabellen (Dateien) Auswerten: Anfang finden



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
wiederlader
 2007-04-24 20:11
#76199 #76199
User since
2007-01-03
36 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen,

anhand einer Datenbank-Abfrage (Ergebnis wird in einer Text Datei wie folgt abgelegt) soll ich eine Schwellwertüberprüfung vornehmen.
In der Datei "abfrage.txt" stehen die folgenden Datenfelder (Produkt;Status;Anzahl)

Schrauben;Error;234;
Schrauben;Process;12;
Schrauben;Waiting;151;
Muttern;Error;45;
Muffen;Waiting;156;
Muffen;Process;23;

In der Datei "schwellwerte.txt" stehen die Schwellwerte (Produkt;Status;yellow;red)

Schrauben;Error;200;500; (bis 199 grün, von 200 bis 499 gelb und ab 500 rot)
Schrauben;Process;25;50;
Schrauben;Waiting;100;150;
Muttern;Error;10;30;
Muffen,Waiting;400;800;
Muffen,Process;5;10;

Als Auswerte-Ergebnis Stelle ich mir folgendes vor (Produkt;Status;Anzahl;Auswert):
Schrauben;Error;234;gelb
Schrauben;Process;12;grün
Schrauben;Waiting;151;rot
Muttern;Error;45;grün
Muffen;Waiting;156;grün
Muffen;Process;23;rot

Ich weis überhaupt nicht wie ich die Auswertung überhaupt angehen soll.
Wenn Das Produkt "Schrauben" mit dem Status "Error" die Anzahl "234" hat soll die Auswertung anhand der Schwellwertdatei ergeben das das Produkt "Schrauben" im Status "Error" im gelben Bereich liegt. Wenn die Anzahl auf 500 oder darüber liegt ist das Produkt "Schrauben" im Status "Error" im roten Bereich.

Mir fehlt jeglicher Ansatz wie ich anfangen könnte. Hat jemand eine Idee oder Vorschlag (ich hoffe Ihr versteht mein Anliegen).

Danke, Gruß Markus
MisterL
 2007-04-24 20:28
#76200 #76200
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Dazu könnte man Regular Expressions verwenden, die die einzelnen Zeilen nach Zahlenwerten durchsuchen und diese in einer Variablen speichern. Mittels if-Abfragen (oder einem Hash) kann man dann die Ausgabe steuern.

Gruss MisterL
“Perl is the only language that looks the same before and after RSA encryption.”
GoodFella
 2007-04-24 20:55
#76201 #76201
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Als erstes liest du die beiden Dateien in zwei Hashes ein; am besten mit der zweiten Methode aus Deinem ersten Thread.
Du bekommst die Einzeldaten, indem du an ; splittest.

Danach iterierst du über den ersten Hash und suchst dir dazu dann in der Schleife die jeweiligen Schwellwerte heraus; setzt diese in eine entsprechende Bedingung und gibst grün,gelb oder rot aus bzw. speicherst die Daten in einem weiteren oder dem alten Hash.

Das ist die Vorgehensweise. Solltest du damit nicht weiterkommen, dann bitte poste doch mal Deine Ansätze und wir helfen Dir gerne weiter.
PerlProfi
 2007-04-24 21:03
#76202 #76202
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Für das Einlesen der Werte würde ich dir eher split() empfehlen anstatt reguläre Ausdrücke.
Für das Einlesen der Dateien kannst du dir auch eine schöne Subroutine bauen.

Dabei würde ich darauf achten, dass die Werte später einfach erreichbar sind.
Zum Beispiel Produkt und Status als einen key für einen Hash benutzen um einfacher vergleichen zu können.

Die Values der Hashes könnten vielleicht einmal einfache Skalare sein, für die Schwellwerte dann aber anon. Arrays.

Ein einfaches Beispielskript sähe so aus:
Code: (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
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dumper;

# abfrage datei einlesen
my $data = &datei_lesen('abfrage.txt');

# schwellwerte datei einlesen
my $werte = &datei_lesen('schwellwerte.txt');

# daten vergleichen und anpassen
foreach my$key (keys %{$data})
{
# roter bereich
if ($data->{$key} > $werte->{$key}->[1])
{ $data->{$key} = 'rot' }

# gelber bereich
elsif ($data->{$key} > $werte->{$key}->[0])
{ $data->{$key} = 'gelb' }

# gruener bereich
else
{ $data->{$key} = 'gruen' }
}

# Ergebnisse Anzeigen
print Dumper($data);

# NAME: datei_lesen()
# USE: Datei anhand des musters in einen Hash einlesen.
# PARAMETERS: Filename
# RETURNS: Hash reference
sub datei_lesen($)
{
# pick parameters
my($file) = @_;

# open file
open(my$fhIN, '<', $file)
or die "open failed: $!";

# read data
my %data;
while (my$line=<$fhIN>)
{
chomp($line);

# split line
my @tracts = split(';', $line);

# key results from product and status
my $key = join(';', splice(@tracts, 0, 2));

# maybe we have multiple values
if ( @tracts > 1 )
{ $data{$key} = [@tracts] }
else
{ $data{$key} = $tracts[0] }
}

# close file
close($fhIN);

# return data reference
return \%data;
} # datei_lesen

__END__

Müsste so, oder so ähnlich funktionieren.
Für die Ausgabe habe ich jetzt einfach Data::Dumper benutzt.

MfG
Ronnie
 2007-04-24 21:09
#76203 #76203
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Entsprechend der von GoodFella vorgeschlagenen Methode, und dem was du aus dem anderen Thread schon kennst:
Code: (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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %set;

my @limits = (
"Schrauben;Error;200;500",
"Schrauben;Process;25;50",
"Schrauben;Waiting;100;150",
"Muttern;Error;10;30",
"Muffen;Waiting;400;800",
"Muffen;Process;5;10",
);

while (my $row = pop @limits) {
my @cols = split /;/, $row;
$set{$cols[0]}->{$cols[1]}->{'min'} = $cols[2];
$set{$cols[0]}->{$cols[1]}->{'max'} = $cols[3];
}

warn Dumper \%set;

while (<DATA>) {
chomp;
my @row = split;
$row[3] = 'green' if $row[2] < $set{$row[0]}->{$row[1]}->{'min'};
$row[3] = 'yellow' if $row[2] >= $set{$row[0]}->{$row[1]}->{'min'}
and $row[2] < $set{$row[0]}->{$row[1]}->{'max'};
$row[3] = 'red' if $row[2] > $set{$row[0]}->{$row[1]}->{'max'};
print join ' ', @row;
print "\n";
}

__DATA__
Schrauben Error 234
Schrauben Process 12
Schrauben Waiting 151
Muttern Error 45
Muffen Waiting 156
Muffen Process 23
wiederlader
 2007-04-25 13:16
#76204 #76204
User since
2007-01-03
36 Artikel
BenutzerIn
[default_avatar]
Danke an Alle für die Tipps, Vorschläge und Lösungen. Ich versuche diese umzusetzen und zu verstehen, werde aber sicherlich noch einige Fragen dazu haben.
Gruß, Markus
wiederlader
 2007-05-03 12:40
#76205 #76205
User since
2007-01-03
36 Artikel
BenutzerIn
[default_avatar]
Hallo Ronnie, ich habe mir als erstes Deine Lösung vorgenommen. Da ich noch nie mit einem Hash gearbeitet habe, verstehe ich die Hash Zuweisung nicht wirklich. Würde mir bitte jemand die Zeile "$set{$cols[0]}->{$cols[1]}->{'min'} = $cols[2];" erklären. Ich interpretiere sie so, das der key
"Muffen->Process->min"und der value 5 ist. Oder bin ich auf dem Holzweg? Oder hat "->" eine andere Bedeutung. Ich habe nur herausgefunden das "=>" eine Möglichkeit ist ein Komma zu schreiben.
Wie kann ich mir die vorhanden keys und values im hash (außer mit dem Dumper) anzeigen lassen?

Quote
my %set;
my @limits = (
"Schrauben;Error;200;500",
"Schrauben;Process;25;50",
"Schrauben;Waiting;100;150",
"Muttern;Error;10;30",
"Muffen;Waiting;400;800",
"Muffen;Process;5;10",
);

while (my $row = pop @limits) {
### Mit pop wird das lezte Element/Zeile am Ende des Arrays weggenommen und $row zugewiesen
### Muffen;Process;5;10
my @cols = split /;/, $row;
### Der Feldtrenner ; wird durch split entfernt und dem Array "@cols jeweis die 4 Wert der Zeile zugewiesen
### $cols[0], $cols[1], $cols[2], $cols[3]
### Muffen Process 5 10
$set{$cols[0]}->{$cols[1]}->{'min'} = $cols[2];
$set{$cols[0]}->{$cols[1]}->{'max'} = $cols[3];
}
bloonix
 2007-05-03 12:49
#76206 #76206
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=wiederlader,03.05.2007, 10:40]Würde mir bitte jemand die Zeile "$set{$cols[0]}->{$cols[1]}->{'min'} = $cols[2];" erklären. Ich interpretiere sie so, das der key
"Muffen->Process->min"und der value 5 ist. Oder bin ich auf dem Holzweg?[/quote]
Nein, das ist korrekt. Ein wenig anders ausgedrückt:

Code: (dl )
1
2
3
4
while (my $row = pop @limits) {
  my ($type, $status, $min, $max) = split /;/, $row;
  @{$set{$type}{$status}}{qw/min max/} = ($min, $max);
}
\n\n

<!--EDIT|opi|1178182224-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-05-03 13:20
#76207 #76207
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=opi,03.05.2007, 10:49][quote=wiederlader,03.05.2007, 10:40]Würde mir bitte jemand die Zeile "$set{$cols[0]}->{$cols[1]}->{'min'} = $cols[2];" erklären. Ich interpretiere sie so, das der key
"Muffen->Process->min"und der value 5 ist. Oder bin ich auf dem Holzweg?[/quote]
Nein, das ist korrekt. Ein wenig anders ausgedrückt:[/quote]
Es ist ein wenig unglücklich ausgedrückt, dass "Muffen->Process->min" der Schlüssel ist. Denn die -> sind für die Dereferenzierung da.

Auf der ersten "Ebene" ist "Muffen" der Schlüssel, der als Wert eine Hashreferenz hat. In dieser Hashreferenz ist "Process" der Schlüssel, ebenfalls mit einer Hashreferenz als Wert. Dort ist "min" der Schlüssel und die "5" der Wert.

Ganz lesenswert: perlreftut
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-05-03 13:38
#76208 #76208
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,03.05.2007, 11:20]Es ist ein wenig unglücklich ausgedrückt, dass "Muffen->Process->min" der Schlüssel ist. Denn die -> sind für die Dereferenzierung da.

Auf der ersten "Ebene" ist "Muffen" der Schlüssel, der als Wert eine Hashreferenz hat. In dieser Hashreferenz ist "Process" der Schlüssel, ebenfalls mit einer Hashreferenz als Wert. Dort ist "min" der Schlüssel und die "5" der Wert.[/quote]
Er meinte es wahrscheinlich genauso, nur kann er sich nicht so galant
ausdrücken? ;)\n\n

<!--EDIT|opi|1178185378-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-04-24 20:11.