Thread Daten suchen / filtern
(20 answers)
Opened by testy at 2013-11-26 13:32 Guest testyDas beherrschen von Perl ist kein zwingende Voraussetzung für ein Mitgliedschaft. :-) Melde Disch einfach an, dann müssen deine Beiträge auch nicht mehr von Admins freigegeben werden. Guest testy Besser als viele andere :-) Guest testyUnwissenheit sollte dich nicht hindern zu Fragen. Wir antworten gern, wenn du auch daraus lernst :-) Aber nun zu deinen Fragen. Zuerst das zweite. Du beschreibst ein Zweidimensionales Array. Also eine Matrix. Die Frage ist wie groß sie wird und ob sie dünn besetzt ist oder dicht. Ich Frage aus folgendem Grund. Bei Dünn besetzten Matrizen erzeugt perl viele leere Arrayeinträge, die alle Speicher verbrauchen. (angenommen du schreibst nur das Feld 10000x100000 dann produziert perl 100999 leere Array Einträge) Solange wir uns im Breich von 256 (FF) bewegen ist das kein Problem. Bei größeren Werten sollte man eine andere Struktur wählen. z.B Hashes. Aber ich gehe nun einfach mal davon aus dass es bei maximal 256x256 (\xFF x \xFF) Einträgen bleibt. Da benutzt du am besten ein Array my @matrix. Um aus den Hex-Werten Zahlen zu machen benutze $zahl=hex($wert) Zur ersten Frage. Auch hier bietet sich eine Regexp an. etwas in der Art: $data=~/(?:2004|04)(..)(..)(..)(.+?)1003/ dann stehen die Werte in $1,$2,$3,$4 ein andere Möglichkeit wäre unpack, was dir aber sicher Probleme bereiten würde. Nun das ganze im Code: 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 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $file_in="test.txt"; # matrix mit den Werten. my @matrix; # Datei öffnen open(my $fhi, '<', $file_in) or die("Error open $file_in ($!)\n"); # lese Datei zeilenweise while(my $line=<$fhi>) { # auf korrektes Format testen # und gleich das Datum holen next unless $line =~ /<([^>]+)>([^\r\n]+)/; my ($date,$data)=($1,$2); # Daten zerschneiden # beginnt mit 2004 oder 04 und endet vor 1003 while($data=~s/(?:2004|04)(..)(..)(..)(.+?)(?=1003)//) { #matrix füllen: my ($wert_a,$pos_b,$pos_c,$wert_d)=($1,hex($2),hex($3),$4); $matrix[$pos_b][$pos_c]=$wert_d; } } # Datei schließen close($fhi); # Testausgabe mit Data::Dumper: print Dumper(\@matrix); |