hotti: csv - Dateihandhabung

Beitrag lesen

hi,

Gibt es eine andere Möglichkeit A2 einzuschieben, außer die gesammte DB einzulesen, den entsprechenden Schreibvorgang nach A1 abzuwarten und mit A2 zu ergänzen, um dannach den Rest ebenfalls wieder zurück zu schreiben?

Wenn Du das transaktionsicher haben willst, nein. Transaktion heißt: Lesen UND Schreiben, und das darf nur ein Prozess. Schau Dir flock() an und sysopen(). Die Funktion sysopen() ist etwas komfortabler als open() was Dateizugriffe betrifft. Es empfiehlt sich, die Datei auf einen Hash oder ein Array zu lesen und es lohnt auf jeden Fall, sich damit zu befassen.

Das sieht dann so aus:

  
tie %hash, 'myClass', 'dateiname'; # LOCK_EX  
# in Class/Konstruktor wird das Handle mit sysopen() erstellt und gelockt  
# die Datei wird deserialisiert auf einen hash gelesen  
  
{code...}  
  
untie %hash; # Serialize, zurückschreiben der Datenstruktur in die Datei  

Freilich sind CSV-Dateien u.a. Dateien, die textlich strukturiert sind nicht gerade performant. Mit pack() und unpack() kannst Du jedoch Felder definieren und damit auf einen Delimiter verzichten:

  
 $binary_rec = pack("Z10Z10", $name, $vname); # Zwei Felder, je 9 byte  
 ($name, $vname) = unpack("Z10Z10", binary_rec); # binary_rec hat 10 byte  

Geschrieben und gelesen wird im binmode HANDLE (:raw), zum Lesen gibts die read()-Funktion. Zeilenumbrüche braucht eine solche Datei nicht. Performant sind solche Dateien bis einige Megabyte und mehr 20000 Records.

Hotti