Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11651[/thread]

Blöcke in Listen erkennen und rausschreiben



<< >> 6 Einträge, 1 Seite
Gast Gast
 2008-04-16 14:37
#108456 #108456
Hallo,

ich bin noch nicht lange mit Perl unterwegs und suche nun Lösungsansätze für eine Aufgabenstellung mit der ich noch nie zu tun hatte. Über Hilfe würde ich mich freuen.

Die Situation:

Ich lese Ascii-Dateien ein. Die Zeilen der Datei bilden Datenblöcke ab. Es können beliebig viele Datenblöcke enthalten sein und es können sich Datenblöcke wiederholen. Aber es sind immer komplette Blöcke.

Ein Block ist wie folgt definiert:
1 Zeile <VORSATZ>
1 bis n Zeilen <DATENSATZ>
1 Zeile <NACHSATZ>

VORSATZ und NACHSATZ enthalten Prüfsummeninformationen zu den dazwischen liegenden Detail-Datensätzen. VORSATZ und NACHSATZ kann ich beim Parsen nicht eindeutig identifizieren, da ich den Prüfsummenalgorithmus nicht kenne. Ich kann aber DATENSATZ dazwischen eindeutig identifizieren.

Immer wenn ich einen Block mit gewünschen Datensätzen finde, muss ich den kompletten Block in eine neue Datei schreiben. Das Problem dabei ist, dass ich keine Idee habe, wie ich die dazu passenden VORSATZ und NACHSATZ Zeilen sauber identifiziere und wegspeichere. Das davor- und dahinterschreiben ist dann wieder kein Problem.

Das hier habe ich schon:

Code: (dl )
1
2
3
4
5
6
7
8
9
        if ($a =~ /^0412/) {           # zeilenlänge 576?
$a = '<>'.$a; # spitze klammern davor
push(@a100,$a); # zeile ins array schreiben
}

if ($a =~ /^0824/) { # siehe oben, nur mit anderer satzlaenge
$a = '<>'.$a;
push(@a200,$a); # zeile ins array schreiben
}


In den Arrays stehen jetzt alle möglichen Zeilen drin. Wie parse ich die jetzt so dass nur noch die relevanten Blöcke übrig bleiben? Im Array a100 muss ich nach '0412foo' als DATENSATZ suchen; im Array a200 nach '0824bar'. Hat jemand eine Idee?

Ich kann leider keine Module verwenden, da der Unix-Rechner auf dem ich arbeite keine Internetverbindung hat und mir im Programmverzeichnis auch die Schreibrechte fehlen.
renee
 2008-04-16 14:53
#108457 #108457
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zeig doch mal eine Datei mit Beispieldaten!
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/
Gast Gast
 2008-04-16 15:36
#108460 #108460
so ähnlich sehen die aus, im Original zwischen 300 und 900 Zeichen lang. Eine Datei besteht aus 3 bis 300000 Zeilen:

Code: (dl )
1
2
3
<>0412035000650006000000000410080400051200012800000000000000000000009080400000500000
<>041202816000077 100008 00001XXX2000000000000050008040000000000000000000 00000803000056148400AB00040030
<>04120400000000000000000000040009


<>041203 = Vorsatz
<>041202816 = Datensatz
<>041204 = Nachsatz
nepos
 2008-04-16 17:14
#108470 #108470
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wie sieht der Datensatz denn aus, wenn er ueber mehrere Zeilen geht?
Gast Gast
 2008-04-16 17:19
#108473 #108473
Es gibt keine Datensätze mit Zeilenumbruch. Jede Zeile ist, in diesem Fall, 412 Zeichen lang und ggf. mit Spaces aufgefüllt. Ich habe die Sätze aus Daten- und Quellenschutzgründen vor dem Posten in diesem Forum abgeschnitten.
Struppi
 2008-04-17 10:06
#108493 #108493
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wie lautet den die exakte Regel?

<>041203
<>041202
<>041204

Wenn ich das Richtig verstehe ist sieht es so aus: <>OOOOXX
Wobei OOOO die Länge des Datensatzes in oktaler Schreibweise ist?
hat XX eine Bedeutung?

Was willst du abspeichern und was sind die relevanten Blöcken?

Ausserdem widersprichst du dir. Warum schreibst du weiter oben:

Gast+2008-04-16 12:37:08--
Ein Block ist wie folgt definiert:
1 Zeile <VORSATZ>
1 bis n Zeilen <DATENSATZ>
1 Zeile <NACHSATZ>


und dann später

Gast+2008-04-16 15:19:06--
Es gibt keine Datensätze mit Zeilenumbruch.
<< >> 6 Einträge, 1 Seite



View all threads created 2008-04-16 14:37.