DBF-Converter gesucht ...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

DBF-Converter gesucht ...

Beitrag von PureLust »

Hi zusammen, ...

ich sitze aktuell an einem Projekt, bei dem ich Daten aus DBF-Dateien auslesen muss.
Da ein direkter Zugriff auf DBF-Dateien in PureBasic (meines Wissens nach) ja leider nicht möglich ist suche ich nun dafür einen DBF-Converter, der mir dann z.B. einfach CSV-Dateien (oder Ähnliches) auswirft, wobei er jedoch auch die dazugehörigen Index-Dateien berücksichtigen müsste.
(Die Index-Unterstützung ist in diesem Fall wichtig, da ich wissen muss, ob ein Datensatz gelöscht wurde oder nicht und ich annehme, dass diese Information in den Index-Dateien steckt).

Hätte da evtl. jemand eine Idee oder einen Tipp für einen entsprechenden Konverter?

Vielleicht könnte ja auch jemand helfen, der noch Kenntnisse in FoxPro hat (da ich annehme dass die Anwendung und somit auch die DBF-Dateien mit FoxPro erstellt worden sind).

Falls jemand Interesse hätte, so hätte ich hier mal sowohl eine der DBF-Dateien als auch die zugehörige Index-Datei hochgeladen.

Hier ein paar weitere Infos was genau ich brauche bzw. was ich schon probiert habe:
Im Forum habe ich bzgl. DBF-Dateien einen Wrapper für Cheetah4 gefunden.
Ich habe damit bereits etwas herum experimentiert, kam damit aber nicht wirklich zu einem zufriedenstellenden Ergebnis.

Ich brauche auch keine Möglichkeit in die DBF zu schreiben, sondern müsste nur die aktuellen Daten daraus auslesen und verwerten können.

Momentan mache ich das über das Commandozeilen basierte Tool "CDBFlite.exe" und konvertiere mir die DBFs in CSV-Dateien.
Das klappt im Grunde auch ganz gut - nur unterstützt CDBFlite leider keine Indexe.
Das große Problem was ich nun habe ist, das ich in den erstellten CSV-Datein auch die gelöschten Datensätze habe, ohne jedoch eine Möglichkeit zu haben, diese zu erkennen.

Falls jemand ein gutes Konverter-Tool kennt (ideal wäre eine Steuerung per Commandozeile) dass auch die Indexe berücksichtigt wäre das natürlich super.

Eine weitere Möglichkeit wäre, wenn noch jemand FoxPro (oder eine andere Programmiersprache) hätte, die solche DBF-Dateien samt Index-Dateien verarbeiten kann und vielleicht Lust hätte kurz eine kleine Konverter-Routine zu schreiben.
Einfach DBF-Datei in, CSV-Datei-out würde da schon vollkommen genügen.


Schöne Grüße und schon mal vielen Dank im Voraus, <)
PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: DBF-Converter gesucht ...

Beitrag von NicTheQuick »

Hier findest du eine Beschreibung zum DBF-Format, damit du es selbst auslesen kannst: wotsit.org

Ansonsten bietet mein Ubuntu mir OpenOffice als mögliches Programm an, das mir dieses Dateiformat öffnen kann. Wenn ich dies dann tue, kommt es allerdings zu einem Ein-/Ausgabefehler nach der Auswahl des Zeichensatzes. Vielleicht geht es ja mit LibreOffice, aber angeblich soll auch OpenOffice das DBase-Format importieren können.

Wenn ich mir von 'file' den Dateityp geben lasse, erscheint "DBase 3 data file (60 records)"
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DBF-Converter gesucht ...

Beitrag von Kiffi »

Hallo PureLust,

habe mal ein wenig experimentiert. Meines Erachtens werden die Löschenkennzeichnungen
der Datensätze nur in der *.DBF-Datei vermerkt. Die Index-Datei ist hiervon wohl unberührt.

Habe mit einem Tool mal einen Datensatz gelöscht und sowohl Quell- als auch Zieldateien
miteinander verglichen. Während die Index-Datei nicht verändert wurde, wurde in der DBF-Datei
hinter dem entsprechenden Datensatz ein Sternchen '*' eingefügt (siehe Screenshot).
Das scheint das Löschkennzeichen zu sein.

Bild

Weiter bin ich momentan noch nicht gekommen. Wollte nur darauf hinweisen, bevor Du Dich
zu sehr auf die Index-Datei einschießt. :-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: DBF-Converter gesucht ...

Beitrag von H.Brill »

Lade dir doch einfach die Freewareversion von xprofan.com
runter. Ich glaube, die 9.1er, ist jetzt auch Freeware.
http://xprofan.de/start.htm

Profan kann ja dBase (auch mit index und löschen).
Ist auch meines Wissens ein Tool dabei, das zumindest
dBase lesen kann.
Damit kannste dann selber dein Programm zum Konvertieren
ins Csv schreiben.
Andere Möglichkeit :
Frank Abbings Listview.dll kann übrigens auch mit dBase - Dateien
umgehen. Damit könnte man eine dBase ins Listview laden und als .csv
wieder abspeichern. Da mußt du aber die Felder der dBase bzw. deren
Feldnamen wissen.

Edit : Habs gerade mal mit XProfans Helfer, die im Code-Editor im Menü
dabei sind, getestet. Das ist schon mal die Struktur bzw. Felddefinitionen :

Code: Alles auswählen

ZUORDNUNG;N;2;0
KENN_NR;N;6;0
VON;C;6;0
BIS;C;6;0
TAGE;N;2;0
ART;N;3;0
STD;C;4;0
UEBERNAHME;L;1;0
PB 6.10
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: DBF-Converter gesucht ...

Beitrag von Danilo »

MS Excel soll auch konvertieren können:
http://stackoverflow.com/questions/1256 ... -converter

Gibt viele Google-Treffer für "dbf converter freeware" und "dbf converter". ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DBF-Converter gesucht ...

Beitrag von Kiffi »

@PureLust:

hier mal ein kleines Quick'nDirty Kommandozeilentool. Ignoriert beim
exportieren die gelöschten Datensätze. Ist aber lediglich mit Deiner
Beispiel-DBF getestet worden.

Download:
http://tuebbentools.bplaced.net/dbf2csv.exe

Aufruf:

Code: Alles auswählen

dbf2csv "input.dbf" "output.csv"
Evtl. auftretende Fehler werden momentan noch mittels Messagebox
angezeigt. Kann ich bei Bedarf noch durch einen entsprechenden
Rückgabefehlerwert ersetzen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: DBF-Converter gesucht ...

Beitrag von PureLust »

Jungs, Jungs, Jungs, ... watt soll ich da sagen?
Vielen Dank für die ganzen Antworten .... Ihr seid halt einfach Spitze.
:allright:

@Nic: Die Beschreibung des DBF-Formats sieht echt interessant aus, danke.
Wollte mich da zwar eigentlich nicht rein arbeiten, aber wenn ich keinen passenden Konverter gefunden hätte (wonach es Dank Kiffi ja nun aber zum Glück aussieht <) ), hätte ich mich da wohl durchwurschteln müssen.

@H.Brill: Die ListView.dll von Frank kannte ich noch garnicht. Nachdem, was ich hier im Forum nun darüber gefunden habe scheint die aber wirklich ein kleiner Alleskönner zu sein. Schade nur, dass http://www.frabbing.de momentan wohl nicht nutzbar zu sein scheint (zumindest nicht mit Opera), so dass ich mir die Lib leiden nicht näher anschauen konnte.
Werd's später dann aber wohl nochmal versuchen. ;)
Wie bereits oben erwähnt hat sich die Suche nach einer Konvertiermöglichkeit und somit wohl auch ein eventueller Abstecher nach Profan dank Kiffi wohl auch erst mal erledigt ... aber danke für die Tipps. :allright:

@Danilo: Mit Excel hatte ich's zwar bisher noch nicht versucht (da ich's auf meinem Laptop nicht drauf habe), aber PlanMaker aus dem SoftMaker Office Paket hatte mir bei meinen ersten Tests bereits gute Dienste geleistet. ;)
Nur werden leider auch da die gelöschten Datensätze einfach mit angezeigt (was ich bislang allerdings nicht wusste und somit viel unnötige Zeit aufgewendet habe um hinter den Sinn von doppelten Datensätzen zu kommen).

Was die Google-Suche nach DBF-Konvertern angeht, so hatte ich das natürlich schon hinter mir und hatte auch bereits etliche durch getestet.
Wie in meinem ersten Post im Kleingedruckten geschrieben, hatte ich mich letztendlich für CDBFlite entschieden, da dieser gut per Commandline zu steuern war und vor allem auch den UTF-Zeichensatz (den ich benötige) unterstützt.
Auch gab es (angeblich?) einen Schalter "/DELETED (+/-)", wodurch ich dachte, dass CDBFlite mir die gelöschten Datensätze ausblendet, aber entweder das funktioniert nicht bei meinen DBFs, oder ich bin zu dämlich die Parameter richtig anzugeben. :roll:

@Kiffi: Tja ... watt soll isch dazu sagen, Du alte Kanone: YOU REALLY MADE MY DAY !!!!!! :mrgreen:
Dein Teilchen funnzt bisher super und blendet auch wie gewünscht die gelöschten Datensätze aus ... los perfectos. :allright:

Stellt sich bei mir natürlich sofort die Frage: Wie hattu dat jemacht? :D
Wenn Du Lust, Zeit und Muße hast und es Deine (Du weißt schon) zulässt (oder Du endlich mal wieder Deine WhatsApps abgerufen hast :twisted: ), dann lass uns doch mal wieder 'ne Runde babbeln.

Bis dahin erst noch mal vielen Dank an Alle für die tollen Tipps und die schnelle Hilfe, :allright:
PureLust.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: DBF-Converter gesucht ...

Beitrag von bobobo »

Der Vollständigkeit halber.
Bis auf die Anzeige gelöschter Sätze klappt es mit PB relativ nativ auch,
wenn man sich den ollen vfp-odbc-Treiber von MS holt (ab WindowsXP muss der
wohl nachinstalliert werden) und dann per odbc-verknüpfung auf DBFs zugreift.
Ich mache sowas bei einem Kundenprojekt und zumindest lesenderweise ohne weitere
Probleme.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DBF-Converter gesucht ...

Beitrag von Kiffi »

bobobo hat geschrieben:und dann per odbc-verknüpfung auf DBFs zugreift.
joh, so mache ich's auch.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DBF-Converter gesucht ...

Beitrag von Kiffi »

Habe gestern noch mal versucht, das ganze mit PB und COMate
zu realisieren (anstelle von .NET).

Bekomme es hier leider auch nicht hin, dass die gelöschten Records
ignoriert werden (trotz DELETED=YES, welches lt. Doku ausreichen
sollte).

Dennoch stelle ich hier mal den Code rein. Vielleicht findet ja einer die
Lösung. (bobobo? (ja, ich weiß, mit dem COMate-Krams hast Du ja
nix am Hut)).

Code: Alles auswählen

IncludePath "[DeinPfadZu]\COMatePLUS\" ; Pfad anpassen!
XIncludeFile "COMatePLUS.pbi"

EnableExplicit

Procedure dbf2csv(DbfFile.s, CsvFile.s)
  
  Protected oCN.COMateObject
  Protected oRS.COMateObject
  
  Protected Query.s
  Protected ConnectionString.s
  
  Protected EOF
  Protected CountColumns
  Protected ColumnCounter
  Protected FieldValue.s
  
  Protected FF
  Protected CsvLine.s
  Protected CsvLines.s
  
  If FileSize(DbfFile)=-1
    Debug "DbfFile doesn't exists"
    ProcedureReturn #False
  EndIf
  
  Query = "SELECT * FROM " + DbfFile
  
  ConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;DELETED=YES;"
  
  oCN = COMate_CreateObject("ADODB.Connection")
  
  If oCN
    
    If oCN\Invoke("Open('" + ConnectionString + "')") = #S_OK
      
      oRS = oCN\GetObjectProperty("Execute('" + Query + "')")
      
      If oRS
        
        CountColumns = oRS\GetIntegerProperty("Fields\Count")
        
        Repeat
          
          EOF = oRS\GetIntegerProperty("EOF")
          
          If EOF = -1 : Break : EndIf
          
          CsvLine = ""
          
          For ColumnCounter = 0 To CountColumns - 1
            
            FieldValue = oRS\GetStringProperty("Fields(" + Str(ColumnCounter) + ")")
            
            CsvLine + FieldValue
            
            If ColumnCounter < CountColumns - 1
              CsvLine + ";"
            EndIf
            
          Next
          
          CsvLines + CsvLine + #CRLF$
          
          oRS\Invoke("MoveNext")
          
        ForEver
        
        oRS\Invoke("Close")
        oRS\Release()
        
        CsvLines = Left(CsvLines, Len(CsvLines) - 2)
        
      Else
        Debug "!oRS: " + COMate_GetLastErrorDescription() 
      EndIf

    EndIf
    
    oCN\Release()
    
  Else
    Debug "!oCN: " + COMate_GetLastErrorDescription() 
  EndIf
  
  If CsvLines
    FF = CreateFile(#PB_Any, CsvFile)
    If FF
      WriteString(FF, CsvLines)
      CloseFile(FF)
      ProcedureReturn #True
    Else
      Debug "!FF"
    EndIf
  EndIf
  
  ProcedureReturn #False
  
EndProcedure

dbf2csv([DeineDbfDatei], [ZuErstellendeCsvDatei]) ; Pfade anpassen!
Grüße ... Kiffi
a²+b²=mc²
Antworten