SNOWMAN Geschrieben 14. Dezember 2004 Teilen Geschrieben 14. Dezember 2004 Hi, ich muss grad ein Perlskript schreiben das Dateien nach einer Produktnummer durchsucht und dann den zugehörigen Datenblock ausgibt. Die dateien sind im grunde wie folgt aufgebaut: Int.-Bezeichung Produktnummer1 sonstwas hierwas trallala Int.-Bezeichung produktnummer2 bobbl knüppeldick eßt_mehr_tomaten ... im skript sieht das z.Z. wie folgt aus: opendir(directory, $path); while( defined( $filename = readdir( directory ))){ $file = "$path\\$filename"; if($filename != '.' && $filename != '..' && !(-d $file)){ open datei, "<$file"; while(<datei>){ }#while(<datei>) }#if($filename != '.' && $filename != '..' && !(-d $file)) }#while( defined( $filename = readdir( directory ))) close(directory); ich kann ja jetzt mit if(/^$prodnr/) nach der Zeile suchen wo die prodnummer steht, aber wie bekomme ich dann den dazugehörigen Datenblock? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 14. Dezember 2004 Teilen Geschrieben 14. Dezember 2004 ich hab zwar keine Ahnung von Perl, aber in php würde ich das file zuerst komplett parsen und in eine array struktur bringen die mir die restlichen arbeiten vereinfacht. Gruß, Markus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 14. Dezember 2004 Teilen Geschrieben 14. Dezember 2004 Nunja, das ist nicht unbedingt klug. Zum einen geht es hier um mehrere Dateien innerhalb eines Verzeichnisses. Zum anderen weiss man nie wie groß die Datei(en) sind. Zum dritten kann es ja sein das man Abbrechen kann sobald der Datensatz gefunden ist, dann macht dein Programm zuviel. Solange es Trenner gibt (z.b. Leerzeile) würde ich Zeilenweise in ein Buffer-Array lesen. Sobald der Trenner erreicht ist wird der Buffer auf den Suchstring geprüft. Ist er vorhanden erfolgt die Ausgabe des ganzen Buffers (=Datensatz). Wenn nicht, wird das Array geleert und der Spaß beginnt von vorne. Auf diese Weise benötigt man ein Minimum an RAM für Daten, kann sofort abbrechen wenn der String gefunden wurde und da wir den Stream lesen sollte es für beliebig grosse Dateien funktionieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SNOWMAN Geschrieben 14. Dezember 2004 Autor Teilen Geschrieben 14. Dezember 2004 ja ich glaub so mach ich es. sobald ich den startpunkt einens blocks gefunden hab überprüfe ich ob die nummer dahinter steht die ich suche und setze mir ein flag wenn es die gesuchte ist, danach les ich alles in ein array ein und sobald der nächste anfangspunkt eines blocks erreicht wird steig ich aus wenn der flag 1 ist oder so ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BenjieAul Geschrieben 14. Dezember 2004 Teilen Geschrieben 14. Dezember 2004 Also falls du das Buch "Perl in 21 TAgen" hast, dann kannste da mal gucken. Da ist ein Beispiel drinnen, wie das ganze mit Adressen geht. Musste also nur deine Sachen anstatt den Adressen angeben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SNOWMAN Geschrieben 16. Dezember 2004 Autor Teilen Geschrieben 16. Dezember 2004 so, ich hab das jetzt mal gemacht, aber irgendwie gehts nicht Dateien sind wie gesagt Blockweise aufgebaut: LIN++ ABC XYZ BLAHBLAH LIN++ ABB FKK LIN++ ... Und jetzt brauch in so einen LIN-Block; also vom einschließlich anfangs LIN bis ausschließlich dem nächsten LIN Mein Code will aber irgendwie nich so richtig... EDIT: Die LIN Zeilen sehen wie folgt aus: LIN++Artikelnummer:xy Um nur die Artikelnummer zu bekommen verwende ich den Split-Befehl foreach $file (@files){ open file, "<$file"; while(<file>){ if(/^LIN\+\+/){ ( undef, $line ) = split /\++/; ( $filemlfb, undef) = split /:/,$line; if($filemlfb = $mlfb){ $segment = @_; $found = 1; if(!(/^LIN\+\+/)){ $segment = $segment + @_ + "\n"; }#if(!(/^LIN\+\+/)) }#if($filemlfb = $mlfb) if($found){ close(file); close(directory); return ($segment, $file); }#if($found) }#if(/^LIN\+\+/) }#while(<file>) }#foreach $file (@files) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.