Herbert: dbase dateien verarbeiten ?

Hallo, wer kann mir helfen.
ich arbeite zur Zeit mit php und mysql.
Ich müsste nun dbase-Dateien verarbeiten , was lt. Beschreibung auch gehen sollte.

Nun meine Frage:
Hat jemand erfahrung dabei?
spezielles Problem: in der dbase-Datei sind Felder vom Typ -Memo-
Können diese dann mit PHP ausgelesen werden ?

Viele Grüße
Herbert

  1. Moin,

    spezielles Problem: in der dbase-Datei sind Felder vom Typ -Memo-
    Können diese dann mit PHP ausgelesen werden ?

    Dürfte dem MySQL-Feldtyp text entsprechen.
    Ansonsten mein Vorschlag: erstelle eine System-DataSource über ODBC-Setup. So kommst Du ran an die Daten.

    --roro

  2. Hello,

    Nun meine Frage:
    Hat jemand erfahrung dabei?

    Ja, ich habe einen eigenen Konverter dafür erstellt.

    spezielles Problem: in der dbase-Datei sind Felder vom Typ -Memo-
    Können diese dann mit PHP ausgelesen werden ?

    Mit den vorhandenen dBasefunktionen nicht.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

  3. Hi there,

    ich arbeite zur Zeit mit php und mysql.
    Ich müsste nun dbase-Dateien verarbeiten , was lt. Beschreibung auch gehen sollte.

    Jein. Nur wenn man das entsprechende Modul einbindet. Das ist aber leider nicht wirklich brauchbar.

    Nun meine Frage:
    spezielles Problem: in der dbase-Datei sind Felder vom Typ -Memo-
    Können diese dann mit PHP ausgelesen werden ?

    Mit den im dBASE-Modul implementierten Möglichkeiten nicht. Erfahrungsgemäß (kann natürlich nach Fall auch ganz anders sein) steht da meist ohnehin nichts drinnen, was mehr als 250 Zeichen lang ist, somit kann man das Memofeld in ein Characterfeld mit maximaler Länge (je nach Version zw. 250 und 254) verwandeln. Afaik hat es auch Foxproversionen gegegeben (möglichweise VO auch), die in den Memofeldern binäre Daten gespeichert haben. WEnn Du soetwas vorliegen hast, dann hast Du ein kleineres Problem. (musst Du selbst arbeiten;)
    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.

    1. 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

  4. Vielen Dank an Alle,
    wenn ich ganz ehrlich bin ist mir nicht alles verständlich,
    liegt an mir, bin nicht der große php, mysql Profi.

    ich werde nun erstmal ein kleines dbase-Programm machen und die memo-Daten zeilenweise auslesen und in eine neue dbase-datei schreiben
    Dann kann ich die Org-Datei ohne memo's in mysql umsetzen und anschließend die entspr. memos aus der neuen dbase-Datei holen.

    nochmals vielen Dank
    Herbert

    1. Hello,

      ich werde nun erstmal ein kleines dbase-Programm machen und die memo-Daten zeilenweise auslesen und in eine neue dbase-datei schreiben

      Besser wäre es, die Memo-Daten jeweils als eigene TXT-Datei unter der Record-Nummer der dBase-Datei rausschreiben zu lassen. das geht nämlich ganz einfach.

      Natürlich darf man beim MySQL-Import diese record-Nummer nicht unterschlagen, sonst bricht man die Verbindung zur Memo-Textdatei wieder.

      Ich bin da schon mindestens 15 Jahre raus.
      Aber bei dBase 4 gab es fcreate() und fwrite() usw.

      Damit konnte man die Memofelder ganz bequem als Textdateien rausschreiben lassen.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. Hello,

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau