Dateiverarbeitung mit PERL

  • Hallo Zusammen,
    ich bin recht neu in der PERL-Umgebung und habe erst ein paar wenige Programme geschrieben. Jetzt benötige ich dringend Hilfe.
    Hier mein Problem:
    Normalerweise bekomme ich aus unserem Vorsystem eine Datei, die nach jedem Datensatz einen CR hat, somit läßt sich die Datei sehr gut verarbeiten (einlesen, nach Vorgaben verändern, ausgeben). Jetzt haben wir ein neues Frontsystem, dass mir eine Datei liefert mit einem schier endlos langem Satz (ca. 27.000 Sätze à 2160 Bytes). Mein erstelltes Programm läuft genau einmal und gibt den Satz ohne Änderung raus. Das ist der Fehler.
    Wie muss ich jetzt das PERL-PGM gestalten, dass es aus einem endlos langen Satz immer wieder die Teilbereiche (Länge 2160) ausliest, und bei einem bestimmten Kriterium eine Änderung vornimmt? Ich bin völlig hilflos.
    Ich wäre sehr froh, wenn mir ein erfahrener Programmierer an dieser Stelle helfen kann.

    Sollten Rückfragen sein, so stehe ich gerne zur Verfügung.
    Ich wünsche allen beteiligten einen schönen Tag und
    vielen Dank im Voraus für diejenige oder denjenigen, die mir die Zeit opfert und hilft.

  • Mit Quellcode könnte man dir besser helfen. Aber dennoch ein Tipp: es gibt die Funktion zum Einlesen von einer Datei. Das Resultat ist ein Array. Dieses Array musst Du durchgehen und kannst somit zeilenweise die Inhalte verarbeiten, neu zusammensetzen und hinterher speichern.

  • So kannst du die Datei byteweise einlesen ;)

    Gruß crAzywuLf :D

    Einmal editiert, zuletzt von crAzywuLf (28. April 2010 um 09:30)

  • Hallo Threadi,
    anbei der von mir erstellte QuellCode, der aber nicht so funktioniert wie er soll.

    #!/bin/perl
    open INFILE, "<y:\\samba\\user\\kto\\sambain.dat";
    open OUTFILE, ">y:\\samba\\user\\kto\\Einzelsatz_SAMBAIN.dat";
    my @Datensatz = ();
    while (<INFILE>) {
    chomp;
    @Datensatz = $_ =~ /(.{2160})/;
    if (substr($Datensatz[0],0,5) eq "02160" ) {
    if (substr($Datensatz[0],113,5) eq "40002") {
    print "Datensatz gefunden\n";
    print OUTFILE "@Datensatz\n";
    last;
    }
    }
    }
    close (INFILE);
    close (OUTFILE);

    Nochmal zum Verständnis. Ich möchte, dass das Programm mir aufgrund eines Kriteriums (oder auch mehrere mit && verknüpft) den entsprechenden Datensatz separat ausgibt und danach aufhört. Der einzulesende Datensatz ist endlos lang, fängt aber alle 2160 Bytes mit dem Längenfeld (5-stellig = 02160) an.

    Ich würde mich freuen, wenn ich Hilfe bekommen würde.
    Danke im Voraus und eine schöne Zeit.
    Liebe Grüße
    Th. Schäfer

  • Hallo Threadi,
    wäre es zuviel verlangt, wenn Sie mir bezogen nauf mein Script die Lösung bauen würden? Ich komme mit dem Beispiel nicht klar und weiß auch nicht, wie ich es umsetzen soll. Da ich Anfänger bin und mich PERL noch nicht so auskenne, würde mir diese Hilfe weiterhelfen.

    Danke für die Unterstützung im Voraus und ein schönes, erholsames WE.

    Viele Grüße
    Th. Schäfer

  • Guten morgen Threadi,
    danke für den Hinweis mit dem SIE. Ich wollte höflich sein, da ich mein Gegenüber ja nicht persönlich kenne. Nochmals Danke.

    Meine erste Bedingung ist, jeder Satz sollte mit dem Längenfeld-Inhalt "02160" beginnen. Sollte normalerweise für jeden Satz gelten.
    Der Ausstiegs-Stopp-wert ist dann die nächste Bedingung. Wenn der Satz an einer vorgegebenen Stelle die "40002" hat, habe ich den Satz gefunden, und der soll dann rausgeschrieben werden. Da es immer nur ein Satz mit dem Key geben kann, kann das PGM hier aufhören.

    Hilft Dir das weiter?
    Es wäre schön, wenn Du mir hier helfen könntest.
    Danke im Voraus für Deine Bemühungen und ich wünsche Dir ein schönes WE.
    Viele Grüße
    Th. Schäfer

  • Also auf deinen obigen Quelltext bezogen würde ich es so probieren:

    Ungetestet, aber sollte vom Sinn her stimmen wenn ich es richtig verstanden habe.

  • Hallo Threadi,
    vielen Dank für deinen Beitrag :-D. Leider funktoniert er nicht. Das PGM läuft zwar fehlerfrei, schreibt mir aber bis zu 50.000 !!! mal raus "Datensatz gefunden" bis ich dann abbreche. In der einzulesenden Test-Datei sind insgesamt nur 3 (Drei) Datensätze, allerding ohne CR, sodass es sich als ein Satz darstellt. Im mittleren Teil (2. Satz) ist der gesuchte Begriff vorhanden, so dass das PGM eigentlich nach dem 2. Array aufhören müßte.
    Ich bin sehr frustriert :mad:, da ich nicht mehr weiß wo vorne und hinten ist.

    Habe schon mehrere Foren und Hinweise durchgeackert :confused:, kriege aber nichts geregelt.

    Es wäre schön :), wenn Du Dich nochmal meiner erbarmen könntest.
    Im Voraus vielen, vielen Dank für die Unterstützung.

    Liebe Grüße aus FFM