Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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)

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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