Hello,
Ist aber keine Tragik, das dbf-Format ist sehr gut dokumentiert. Du musst nur aufpassen, welches Programm und da wiederum, welche Version die dbf-Datei erzeugt hat.
Die Regeln für die Varianzen werden von allen mir bekannten dBase-Derivaten eingehalten. Warum die sich dann also nicht gegenseitig lesen konnten, war mir schon immer unverstänclich.
Das Memo-Format ist etwas komplizierter. Es ist so ähnlich, wie FAT aufgebaut.
Es handelt sich um eine verkettete Liste von $blocksize großen Blöcken, die jeweils am Anfang den Zeiger auf den nächsten Bock haben oder auf NIL. Üblicherweise sind die Blöcke 512 Bytes groß.
Gelöschte Blöcke (also solche, die als gelöscht gelten), werden einfach in die Kette der Gelöschten übertragen.
Ach ja, irgendwo muss natprlich noch eingetragen sein, wie lang der Dateninhalt im Block wirklich ist. Das muss ich nochmal nachschauen.
Ich habe die Pascal-Programme noch irgendwo. Einige davon haben wir auch schon mal in PHP übertragen. Geht ganz problemlos. Hier ein Beispiel:
<?php ### dbase.php ### Thomas Marbach, Thomas Schmieder ###
define("head1bin","C1ver/C1y/C1m/C1d/Lreccount/vhlen/vrlen/C20res");
function get_dbf_header($dbfname)
{
$fdbf = fopen($dbfname,'r');
if (!$fdbf) return false;
$dbfhdrarr = array();
$buff32 = array();
$i = 1;
$goon = true;
while ($goon)
{
if (!feof($fdbf))
{
$buff32 = fread($fdbf,32);
if($i==1)
{
$_head1 = array();
$_head1 = unpack(head1bin,$buff32);
$dbfhdrarr['head'] = $_head1;
}
if ($i > 1)
{
if (substr($buff32,0,1) == chr(13))
{
$goon = false;
}
else
{
$pos = strpos(substr($buff32,0,10),chr(0));
$pos = ($pos == 0?10:$pos);
$fieldname = substr($buff32,0,$pos);
$fieldtype = substr($buff32,11,1);
$fieldlen = ord(substr($buff32,16,1));
$fielddec = ord(substr($buff32,17,1));
$dbfhdrarr['field'][] = array('name' => $fieldname,
'type' => $fieldtype,
'len' => $fieldlen,
'dec' => $fielddec);
}
}
$i++;
}
else
{
$goon = false;
}
}
fclose($fdbf);
return($dbfhdrarr);
}
#===================================================================================
$_header = get_dbf_header('DATA.DBF');
echo "<pre>";
print_r($_header);
echo "</pre>";
?>
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
