Zum Inhalt springen

[Perl] Blockweises Auslesen von Dateien


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...