Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Perl] Blockweises Auslesen von Dateien

Empfohlene Antworten

Veröffentlicht

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?

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

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.

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

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

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)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.