Thread Daten suchen / filtern (20 answers)
Opened by testy at 2013-11-26 13:32

topeg
 2013-11-27 13:17
#172253 #172253
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Guest testy
Muß mal sehen mich hier zu registrieren sobald ich perl besser verstanden habe...
Das 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
Ich hätte noch zwei weiterreichende Anforderungen, evtl. kannst Du mir da ja auch noch Anregungen geben ;-)

Anforderung 1:

...

Anforderung 2:

...

Ich hoffe ist auch eingermaßen verständlich formuliert ;-)

Besser als viele andere :-)


Guest testy
Danach frage ich auch erst mal nicht mehr bis ich mich weiter eingelesen habe ;-)
Unwissenheit 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);

View full thread Daten suchen / filtern