Tom: Datei schreiben

Beitrag lesen

Hello,

ich habe schon oft darüber nachgedacht, wie man für dieses echte Manquo von PHP ein Workaround bauen könnte. Leider unterstützt PHP keine Records  / Structures mit festem Satzaufbau.

Aber auch PHP kann den Dateizeiger gezielt bewegen und hat eine recht gute String-Verarbeitung und da liegt die Lösung.

PHP unterstützt allerdigns auch keine binären Größen, sondern schreibt auch alle numerischen Daten in "human readable ASCII".

Du kannst nun ein Array aufbauen:

Variable  =>   Typ  Datenlänge Wert
--------       ---- ---------- ----------
zahl            N   20         1234567
farbe           C   20         Rot
user            C   30         Thomas der Schlaue

Das macht zusammen 70 Byte Satzlänge.
Diesen String baust Du nun zusammen

$rec = str_pad($def[zahl][wert],$def[zahl][len]).
       str_pad($def[farbe][wert],$def[farbe][len]).
       str_pad($def[user][wert],$def[user][len]);

Dafür baut man sich naürlich eine foreach()-Schleife.
Die Werte dürfen ihre angegebene Länge nicht überschreiten!

Nun hast Du den Datensatz zusammengebaut und kannst ihn wegschreiben.
Das ergibt dann eine Datei mit fester Satzlänge und festem Satzaufbau. Die Vorteile gegenüber den Textdatensaätzen mit variabler Länge saind:
1. Direktzugriff auf jeden Datensatz möglich
2. Auch in grooooßen Textdateien Austausch einzelner Werte möglich,
   ohne die ganze Datei einlesen zu müssen.

Das Auslesen eines einzelnes Wertess ist dann leider entsprechend komplizierter, da man erst die Startposition im Datensatz ausrechnen muss.

Das Herausschneiden geht mit trim(substr($rec,$start,$len)) dafür ganz leicht.

Man müsste sich eine eine kleine Klasse dafür schreiben. Werde ich mal auf meinen Hobby-Zettel nehmen. Und bei PHP müsste man endlich mal die Unterstützung für Low-Level-Dateiformate nachfordern.

Alternativ kann man das natürlich auch mit Arrays und serialize() unserialize machen.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen