Freitag, 17. September 2010

DBF - Dateien erstellen/bearbeiten Teil 2

Unter http://php.net/manual/de/ref.dbase.php habe ich den folgenden Code gefunden:



function get_dbf_header($dbfname) {
$fdbf = fopen($dbfname,'r');

$dbfhdrarr = array();
$buff32 = array();
$i = 1;
$goon = true;

while ($goon) {
if (!feof($fdbf)) {
$buff32 = fread($fdbf,32);
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));

array_push($dbfhdrarr, array($fieldname,$fieldtype,$fieldlen,$fielddec));

}
}
$i++;
} else {
$goon = false;
}
}

fclose($fdbf);
return($dbfhdrarr);
}

$arr = get_dbf_header('/data/file.dbf');
print_r($arr);
?>



nachdem auslesen der Header zeilen habe ich mir den rest in einem weiteren feld des Arrays erstellt.

$rest=$buff32.fread($fdbf, filesize($dbfname));
$dbfhdrarr[]=$rest;

nun kann man mit etwas String bearbeitung und einer Foreach schleife jedes Feld ändern.

Filename ist der Name der Originalen dbf-Datei.
Hier der komplette Code:


function get_dbf_header($dbfname) {
$fdbf = fopen($dbfname,'r');

$dbfhdrarr = array();
$buff32 = array();
$i = 1;
$j = 2;
if ($fdbf) $goon = true;

while ($goon)
{
if (!feof($fdbf))
{
$buff32 = fread($fdbf,32);
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));

array_push($dbfhdrarr, array('feldname'=>$fieldname,'feldtyp'=>$fieldtype,'feldlang'=>$fieldlen,'felddec'=>$fielddec));

}
}
else
{
$anfang=$buff32;
}
$i++;
} else {
$goon = false;
}
}
$rest=$buff32.fread($fdbf, filesize($dbfname));
$dbfhdrarr[]=$rest;

fclose($fdbf);
return($dbfhdrarr);
}

function GetRealSize($file) {
// Return size in Mb
clearstatcache();
$INT = 4294967295;//2147483647+2147483647+1;
$size = filesize($file);
$fp = fopen($file, 'r');
fseek($fp, 0, SEEK_END);
if (ftell($fp)==0) $size += $INT;
fclose($fp);
if ($size<0) $size += $INT;
return $size;
}

//-------------------------------------------------
//Werte Auslesen und Anpassen
//-------------------------------------------------


$arr = get_dbf_header($filevalue['filename']); //Kopfzeilen der DBF Auslesen
$rest=$arr[$filevalue['werteindex']]; //Werte der Zellen stehen in array Index 164




if (substr($rest,0,2)!=(chr(13).chr(32)))
{
$rest=chr(13).chr(32).substr($rest,265);
}


$speichern=chr(13).chr(32);//Zeilenumbruch und Leerzeichen vor erstem Datensatz
foreach ($arr as $key=>$value)
{
if (0==$key)
{
$wert=trim(substr($rest,2,($value['feldlang'])-2)); //Wert holen
$rest=substr($rest,($value['feldlang']+2)); //Restlichen String kürzen
}
else
{
$wert=trim(substr($rest,0,$value['feldlang'])); //Wert holen
$rest=substr($rest,$value['feldlang']); //Restlichen String kürzen
}
switch ($key)
{
case 0: $wert=''; //
break;
case 1: $wert=date('dmY'); //Datum
break;
case 2:
break;
case 3:
case 4:
}
}

Mittwoch, 15. September 2010

DBF - Dateien erstellen/bearbeiten

Eine DBF-Datei zu ertsellen ist nicht ganz einfach. Da es sich bei DBF (Foxpro etc.) um eine Binäre-Datei handelt kann man Sie nur schlecht mit einem Text-Editor bearbeiten/erstellen.

Mit etwas Übung kann man sie mit einem Hexeditor ändern. Dazu sollte man aber mit dem Aufbau vertraut sein. Eine gute Beschreibung zu dem Aufbau habe ich unter http://www.dbf2002.com/dbf-file-format.html gefunden.

Um neue DBF Dateien zu erstellen habe ich den einfachen weg gewählt und den Header einer bereits vorhandenen Datei kopiert. Hierdurch sind aber alle Felder genauso definiert wie im Original.