Aber nachdem schon so viele Lösungen vorgetragen wurden, denke ich mal, das Thema ist gelöst?
Coole Beispiele übrigens!

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
lieb gemeinter Hinweis, aber Lazarus ist echt nicht mein Ding.bembulak hat geschrieben:Lazarus/Freepascal mit und ohne Zeos kann DBF übrigens auch lesen.
ähm, ja, bringt aber nix, weil die Aufgabenstellung ja war, alle NICHT gelöschteneine 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.
Richtigbobobo 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.
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)