DBF-Converter gesucht ...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
bembulak
Beiträge: 228
Registriert: 13.12.2005 16:34
Wohnort: Österreich

Re: DBF-Converter gesucht ...

Beitrag von bembulak »

Lazarus/Freepascal mit und ohne Zeos kann DBF übrigens auch lesen.
Aber nachdem schon so viele Lösungen vorgetragen wurden, denke ich mal, das Thema ist gelöst?
Coole Beispiele übrigens! :allright:
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: DBF-Converter gesucht ...

Beitrag von bobobo »

Mir dünkt : solange man dbf-dateien nicht nativ (Dbase oder ähnlichem alten Quark) sondern per ODBC o.ä. ausliest,
dürften die gelöschten Record einfach übersprungen werden.
Somit hat man so keine Chance. Vermutlich..


so 'ne DBF-Datei ist aber auch nur 'ne Datei.
Die kann man ja mal vorher etwas durchsuchen und die entsprechenden Sternchen '2A'
mal durch Leerzeichen '20' ersetzen.
Das Format wird im ff. link beschrieben und ist eigentlich gar nicht soooo schwer
http://wotsit.org/list.asp?fc=6 , dort die Peter Mikalajunas DBF-Definition

Wenn man sich dann zur FIELD DESCRIPTOR ARRAY TABLE
vorgekraxelt hat und an deren Ende '0D' angekommen ist
(dabei natürlich die einzelnen Recordlängen addiert hat so
dass man eine Satzlänge erhält)
ist der Rest ja nicht mehr so schwer.

Ein * vor dem Record bedeutet gelöscht
ein Leerzeichen davor bedeutet ungelöscht


Mutig wäre es einfach alle '2A' durch '20' zu ersetzen.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: DBF-Converter gesucht ...

Beitrag von bobobo »

Lesen kann auch Excel oder Libreoffice

das Problem sind wohl eher die gelöschten Einträge
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: DBF-Converter gesucht ...

Beitrag von bobobo »

eine ganz doofe Lösung ist, die DBf in einen brauchbaren Editor (PSPAD, Uedit) zu laden
und nach der FIELD IDENTIFIER TABLE nach * zu suchen und diese in Leerzeichen zu tauschen.
Das ergibt dann folgendes (nach dem Einlesen in Excel und Ausgabe als csv (was immer excel darunter auch versteht))
ES BEINHALTET ALLE SÄTZE, EHEMALS GELÖSCHT (4 Stück) UND UNGELÖSCHTE

Code: Alles auswählen

ZUORDNUNG;KENN_NR;VON;BIS;TAGE;ART;STD;UEBERNAHME
0;0;000000;000000;0;4;0000;FALSCH
1;1600;220312;220312;0;4;0000;FALSCH
1;1559;000000;000000;0;4;0000;FALSCH
1;1559;030312;060312;0;4;0000;FALSCH
1;1253;000000;000000;0;4;0000;FALSCH
1;1253;100312;200312;0;4;0000;FALSCH
1;1595;000000;000000;0;4;0000;FALSCH
1;1595;000000;000000;0;4;0000;FALSCH
1;1384;000000;000000;0;4;0000;FALSCH
1;1384;040312;070312;0;8;0000;FALSCH
1;1599;050312;060312;0;4;0000;FALSCH
1;1610;200312;210312;0;4;0000;FALSCH
1;1428;220312;220312;0;4;0000;FALSCH
1;1428;150312;150312;0;4;0000;FALSCH
1;1428;000000;000000;0;4;0000;FALSCH
1;1504;000000;000000;0;4;0000;FALSCH
1;1504;010312;020312;0;8;0000;FALSCH
1;1428;290312;290312;0;4;0000;FALSCH
1;1337;000000;000000;0;4;0000;FALSCH
1;1337;050312;080312;0;8;0000;FALSCH
1;1337;130312;160312;0;8;0000;FALSCH
1;1337;210312;240312;0;8;0000;FALSCH
1;1337;290312;300312;0;8;0000;FALSCH
1;1388;280312;280312;0;4;0000;FALSCH
1;1398;000000;000000;0;4;0000;FALSCH
1;1398;150312;160312;0;4;0000;FALSCH
1;1418;000000;000000;0;4;0000;FALSCH
1;1418;200312;200312;0;4;0000;FALSCH
1;1436;000000;000000;0;4;0000;FALSCH
1;1436;130312;160312;0;4;0000;FALSCH
1;1440;000000;000000;0;4;0000;FALSCH
1;1440;260312;280312;0;4;0000;FALSCH
1;1519;000000;000000;0;4;0000;FALSCH
1;1519;290312;300312;0;4;0000;FALSCH
1;1533;000000;000000;0;4;0000;FALSCH
1;1533;080312;080312;0;4;0000;FALSCH
1;1562;000000;000000;0;4;0000;FALSCH
1;1562;090312;090312;0;4;0000;FALSCH
1;1562;170312;170312;0;4;0000;FALSCH
1;1562;280312;290312;0;8;0000;FALSCH
1;1580;000000;000000;0;4;0000;FALSCH
1;1580;050312;050312;0;4;0000;FALSCH
1;1603;000000;000000;0;4;0000;FALSCH
1;1603;050312;080312;0;8;0000;FALSCH
1;1177;000000;000000;0;4;0000;FALSCH
1;1177;120312;120312;0;4;0000;FALSCH
1;1177;220312;230312;0;8;0000;FALSCH
1;1177;260312;300312;0;8;0000;FALSCH
1;1253;180312;210312;0;4;0000;FALSCH
1;1253;260312;290312;0;4;0000;FALSCH
1;1592;000000;000000;0;4;0000;FALSCH
1;1592;150312;150312;0;4;0000;FALSCH
1;1593;000000;000000;0;4;0000;FALSCH
1;1593;190312;220312;0;4;0000;FALSCH
1;1595;080312;090312;0;4;0000;FALSCH
1;1595;110312;150312;0;8;0000;FALSCH
1;1595;190312;230312;0;8;0000;FALSCH
1;1614;000000;000000;0;4;0000;FALSCH
1;1614;010312;020312;0;8;0000;FALSCH
1;1614;050312;090312;0;8;0000;FALSCH
‮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 »

bembulak hat geschrieben:Lazarus/Freepascal mit und ohne Zeos kann DBF übrigens auch lesen.
lieb gemeinter Hinweis, aber Lazarus ist echt nicht mein Ding.

<meckermotzmode>

Habe grade im Wahn noch mal versucht, damit einen Konverter zu erstellen.
In der Komponetenleiste habe ich auch prompt die DBF-Komponente gefunden
und auf meine Form gezogen. Und schon bekomme ich nen Hinweis, dass DBF
deprecated ist und nicht mehr weiterentwickelt wird (wieso wird's dann überhaupt
mit ausgeliefert?). Immerhin steht dort netterweise der Link auf ein alternatives
Package TDBF (ZEOS kenne ich, aber ich wollte es mal hiermit probieren). OK,
heruntergeladen und das Package installiert. Dann musste die IDE neu kompiliert
werden. Danach hagelte es nur noch 'fatale' Fehlermeldungen mit dem Ergebnis, dass
meine IDE (zum x-ten Mal) zerschossen ist. Was mich diese IDE schon Nerven gekostet hat. >_<

Dann schmeiße ich doch lieber mein PB oder mein VB.Net-Express an. Da funktioniert
es wenigstens so, wie ich mir das vorstelle.

</meckermotzmode>

@bobobo:
eine ganz doofe Lösung ist, die DBf in einen brauchbaren Editor (PSPAD, Uedit) zu laden
und nach der FIELD IDENTIFIER TABLE nach * zu suchen und diese in Leerzeichen zu tauschen.
ähm, ja, bringt aber nix, weil die Aufgabenstellung ja war, alle NICHT gelöschten
Datensätze zu exportieren.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: DBF-Converter gesucht ...

Beitrag von bobobo »

habicht wohl überlesen. (brille vergessen)
dann sind da nun echt genug Lösungen dabei.


allerdings , wer dbf als deprecated bezeichnet, hat zwar Recht, aber
eigentlich auch absolut keine Ahnung, da es durchaus immernoch in
alten Anwendungen benutzt wird.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Re: DBF-Converter gesucht ...

Beitrag von shadow »

bobobo hat geschrieben:...
allerdings , wer dbf als deprecated bezeichnet, hat zwar Recht, aber
eigentlich auch absolut keine Ahnung, da es durchaus immernoch in
alten Anwendungen benutzt wird.
Richtig :allright:
Genauso wie in "unserem" Beamtenwesen selbst heutzutage noch Cobol nicht wegzudenken ist!

Und das gute an DBF ist, dass wirklich jeder Programmierneuling mit etwas Erfahrung Zugriffsmechanismen implementieren kann (sehr simple Dateistruktur).
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: DBF-Converter gesucht ...

Beitrag von bobobo »

so isses
Zum Beispiel kann man das obige Problem wie folgt lösen
ohne odbc oder so Kramzeug

Code: Alles auswählen

;
;das Beispiel funktioniert mit dem Beispiel aus diesem Thread
;darf aber gerne angepasst werden., ist ja eh nicht so schön programmiert
;PB4.61 - Windows - KEIN UNICODE !
; Dateipfade entsprechend anpassen oder "requestern" bzw. "commandlinen"
;das Ergebnis kann ich mit Excel 2K prima direkt einlesen
;das gelöscht Flag wird hier im Programm mit ausgegen, kann aber auch zur Umgehung
;der Ausgabe benutzt werden.

Structure struct
  Name.s
  Type.s
  Length.l
  decimals.l
EndStructure

NewList cols.struct()

dbf= ReadFile(#PB_Any,"D:\!!!\AB_03_12.DBF")
*buff=AllocateMemory(16)
pos=0

While Not endheader
  FileSeek(dbf,pos)
  ReadData(dbf,*buff,16)
  
  If  Asc(PeekS(*buff))=13
    Debug "Beginn Datenbereich "+ Hex(pos+1)+"h"
    Bdpos=pos+1
    endheader=1
    Break
  EndIf
  
  If l=2
    l=0
    AddElement(cols())
    cols()\Name=PeekS(*buff)
    Debug cols()\name
    cols()\Type=Chr(PeekB(*buff+11))
    Debug cols()\Type
  EndIf
  
  If l=1 And pos>17
    cols()\Length=PeekB(*buff)
    Debug cols()\Length
  EndIf
  
  If l=1 And pos>17
    If cols()\Type="F"    
      cols()\Length=PeekB(*buff+1)
      Debug cols()\Decimals
    EndIf
  EndIf
  l+1
  pos=pos+16
Wend

csv=CreateFile(#PB_Any,"D:\!!!\AB_03_12.CSV")
; ma guggn
ForEach cols()
  out.s+cols()\Name+";"
  Debug cols()\Name
  Debug cols()\Type
  Debug cols()\Length
  Debug cols()\Decimals
  tutlength+cols()\Length
Next
out.s=Left(out,Len(out)-1) ;rechtes Semikolon weg
WriteStringN(csv,out)
out.s=""

Debug "SatzLänge "+Str(tutlength)

pos=bdpos ;Position auf Anfang Datenbereich

FileSeek(dbf,Bdpos); Dateizeiger auf Anfang Datenbereich
FreeMemory(*buff)
*buff=(AllocateMemory(tutlength+1))
While pos+tutlength+1<Lof(dbf)
  FileSeek(dbf,pos)
  ReadData(dbf,*buff,tutlength+1)
  line.s= PeekS(*buff)
  del.s=Left(line,1)
  line=Mid(line,2,Len(line)-1)

  ;Debug line
  p=0
  ForEach cols()
    out.s+ Mid(line,p+1,cols()\Length)+";"
    p+cols()\Length
  Next
  out.s=Left(out,Len(out)-1) ;rechtes Semikolon weg
  If del ="*"
    out.s+"; gelöscht"
  Else
    
  EndIf
  WriteStringN(csv,out)
  Debug out
  out.s=""
  pos=pos+tutlength+1
Wend
CloseFile(csv)
CloseFile(dbf)
nun habicht aber echt keine Lust mehr , da kann jemand anderes weiter dran rumbasteln
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
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 »

An dieser Stelle nochmals ein großes Danke an alle die hier mit gemacht hatten. :allright:

Waren echt tolle und hilfreiche Sachen dabei und dank den tollen PMs von Kiffi und H.Brill bin ich inzwischen auch auf die perfekte Lösung für mich (per externer Konverter) gestoßen.

Aber auch die native PB-Lösung von Bo³ werde' ich mir noch mal was näher anschauen.
Sowas mal nativ in PB zu haben kann ja nie schaden. ;)

Big Thx nochmal an Alle die so nett geholfen haben.
(Beim nächsten PB-Treffen geht' die erste Runde auf mich.)
Bild Bild

Greetz, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten