![]() |
untypisierte dateien
hallo zusammen,
ich steh grad auf dem Schlauch. Ich hab ne Datei in der diverse Datensätze stehen. jeder DS belegt 1024 Byte. Wie würdet Ihr diese Sätze in eine Datei mit Feldtrennern überführen, damit diese später in eine DB geschrieben werden können. Hab mall ne Ansatz mit blockread gefunden, denke aber das muss doch irgendwie einfacher zu bewerkstelligen sein. Danke Gruss KH |
Re: untypisierte dateien
Hallo,
ich würde mir ein Record (mit den entsprechenden Feldern) bauen und die Datensätze damit einlesen. Grüße Klaus |
Re: untypisierte dateien
Zitat:
|
Re: untypisierte dateien
Zitat:
Zitat:
Aber "einfach" die Daten in dan gewünschte Format konvertieren und neu abspeichern? :gruebel: Entweder du ließt die Blöcke stückchenweise aus (also direkt die einzelnen Felder) oder du erstellst dir einen Record, über welchen du diese Daten dann eventuell zerlegen könntest. |
Re: untypisierte dateien
nein, blcokread meinte ich nicht.
Ein Datensatz hat bestimmte Datenfelder. Diese Felder kannst Du im Record nachbauen.
Delphi-Quellcode:
Grüße
type
TDatensatz = record NName : String[25]; VName : String[25]; .. end; ... var datensatz: TDatensatz; datenFile: File of TDatensatz; begin assignFile(..); reset(datenFile); while not eof(datenFile) do begin read(datenFile,datensatz); //verschiebe datensatz in Datenbank datensatz.NName -> Datenbank datensatz.VName -> Datenbank end; closeFile(datenFile); end; Klaus |
Re: untypisierte dateien
ich danke euch für den Ansatz.
Gruss KH |
Re: untypisierte dateien
Zitat:
|
Re: untypisierte dateien
Zitat:
|
Re: untypisierte dateien
Liste der Anhänge anzeigen (Anzahl: 1)
der DS ist nicht grösser als 1024 byte, aber der Zeichensatz, bzw. die Sonderzeichen machen Probleme.
Ich hänge hier mal eine Datei mit einem DS an. Gruss KH EDIT: ist keine txt datei, habe die Endung nur so vergeben, weil ne dat nicht hochzuladen ging. |
Re: untypisierte dateien
Guten Morgen,
hast Du auch eine Beschreibung zu dem Datensatz? Grüße Klaus |
Re: untypisierte dateien
Zitat:
Ich brauch nur den Namen, also im Beispiel "Mailänder-Schnitte" , die Artikelnr "102" und den Preis 1.200 |
Re: untypisierte dateien
Wurden die Daten evtl. unter DOS angelegt? Dann könnte eine Umwandlung mit OEMToChar helfen.
|
Re: untypisierte dateien
Zitat:
EDIT: heisst dann ich muss byte für byte mit oemtochar durchgehen? |
Re: untypisierte dateien
Nein, OEMToChar verarbeitet ganze Strings.
|
Re: untypisierte dateien
ich hab jetzt
mit:
Delphi-Quellcode:
die ersten 100 byte eingelesen, wobei Zeile 75 byte und Name 25 byte gross ist.
read(f,datensatz);
test:=datensatz.zeile; name := datensatz.name; oemtochar(PChar(test),PChar(test2)); oemtochar(PChar(name),PChar(name2)); Leider steht in test nach dem lesen nix drin. in name steht "il?nderschnitte" und nach der Konvertierung mit oemtochar nur noch ein Leerstring :-( [edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit] |
Re: untypisierte dateien
gibts den keine Möglichkeit die einzelnen bytes direkt zu lesen?
Ich weiss ja an welcher Stelle die stehen, dann könnte man die evtl. direkt lesen? |
Re: untypisierte dateien
Du könntest die Datei z.B. in einen TMemoryStream laden und dessen Methoden dann anwenden (Seek, Read, ReadBuffer, etc.).
|
Re: untypisierte dateien
Zitat:
Danke |
Re: untypisierte dateien
Zunächst würde mich mal interessieren wo dieses seltsame "OEMtoChar" herkommt. in meiner Onlinehile finde ich da nichts.
Ich hätte Dir empfolen alle Zeichen eines Textfeldes über eine Übersetzungstabelle zu jagen und alles wäre gut. Insbesonders da einige alte DOS-Programme teilweise eine etwas eigenwillige/exotische Zeichentabelle genutzt haben. wie sieht eigentlich die Definition von Datensatz aus? Ich hab es übrigens in der Vergangenheit so gehalten, das ich das Einlesen über ein Array [0..x] of Char/Byte erledigt habe und darüber ein Record mit den richtigen Feld/Datendefinitionen gelegt habe:
Delphi-Quellcode:
und dann entweder im Debugger anschauen was in dem Record steht, oder eine Printausgabe machen oder ....
type
tMyrecord = packed record f1 : array [0..$4A] of byte; name : array [$4B..$63] of char; trenn1: byte; rest : array [$65..$3FF]; end; var buffer : array [0..1023] of char; myrecord : tMyrecord absolute buffer; gelesen : integer; ... fs:=tfilestream.create(.......); gelesen:=fs.read(buffer,sizeof(buffer)); ... Und erst wenn Du eine vernünftige Datenstruktur hast, dann erst an der Darstellung drehen, es könnte sonst sein, daß Du irgendwelche Bytes als Char interpretierst. Gruß K-H Edit: Tippfehler Warum zum Teufel wollen hier so viele immer wieder eine Datei Byte für Byte einlesen? Je größer die Datenmenge, die man liest, desto fixer geht alles. Ich versteh das nicht! |
Re: untypisierte dateien
Zitat:
![]() |
Re: untypisierte dateien
Zitat:
[edit=mkinzler]Tag gefixt Mfg, mkinzler[/edit] |
Re: untypisierte dateien
@DeddyH
Danke! war mir entfallen. Zitat:
Gruß K-H |
Re: untypisierte dateien
Zitat:
ich hab einfach einen Record definiert, insgesamt 1024 byte gross, habe die einzelnen Werte die ich brauche definiert(sieht man ja im File wo die stehen, und den Rest wie zb "zeile" gelesen und "weggeworfen". Leider funktioniert das so nicht, wie ich schon oben erwähnte. test habe ich nur testweise gelesen um zu sehen was nach oemtochar "rüberkommt". Endgültig brauche ich nur artnr bezeichnung und preis, welche an festen Stellen im DS stehen. also datensatz.name 25 byte gross, datensatz.nr 3 byte gross und datensatz.preis 8 byte gross. |
Re: untypisierte dateien
Zitat:
bis auf die Umlaute krieg ich die richtige Bezeichnung, aber oemtochar bringt leider nix :-( |
Re: untypisierte dateien
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab mal alles bis auf die Bezeichnung aus der Datei rausgeworfen und mit folgendem Code getestet:
Delphi-Quellcode:
Sieht einwandfrei aus (siehe Anhang).
var sl: TStringlist;
s: string; begin sl := TStringlist.Create; try sl.LoadFromFile('E:\muster.txt'); s := sl[0]; OemToChar(PChar(s),PChar(s)); ShowMessage(s); finally sl.Free; end; end; |
Re: untypisierte dateien
Zitat:
|
Re: untypisierte dateien
Vielleicht SetLength() für den Zielstring vergessen? Ich benutze ja 2 mal dieselbe Stringvariable im Gegensatz zu Deinem Code.
|
Re: untypisierte dateien
Zitat:
ich danke euch bis hierhin, melde mich sicher nochmal. |
Re: untypisierte dateien
hallo zusammen,
das mit den Umlauten funktioniert zwar noch nicht, aber das ist erst mal zweitrangig. Das Einlesen des einen DS aus dem Beispiel funktioniert und zwar folgendermassen:
Delphi-Quellcode:
Die vollständige Datei hat aber 557056 byte , also 544 DS.
tMyrecord = packed record
f1 : array [0..$36] of byte; artnr: array [$37..$3C] of char; f2 : array [$3D..$4A] of byte; name : array [$4B..$63] of char; trenn1: byte; name2 : array [$65..$7D] of char; f3 : array [$7F..$DF] of byte; preis : array [$E0..$E6] of char; rest : array [$E7..$3FF] of char; end; var buffer : array [0..1024] of char; myrecord : tMyrecord absolute buffer; gelesen : integer; FS: TFileStream; test1, test2, test3, test4: string; begin fs:=tfilestream.create('muster.txt', fmOpenRead); gelesen:=fs.read(buffer,sizeof(buffer)); test1:= myrecord.artnr ; test2:= myrecord.name ; test3:= myrecord.name2 ; test4:= myrecord.preis ; die lassen sich zwar vollständig in den Buffer lesen, (buffer : array [0..557056] of char;) aber wie komm ich an die positionen ran? ne while eof geht ja auchnicht :-( EDIT: ich könnte ja 544 files draus machen, aber sicher geht das einfacher, oder? Danke für eure Hilfe. |
Re: untypisierte dateien
Guten Morgen,
der "Lesezeiger, bzw. Leseposition" ändert sich nach jedem Lesevorgang. Liest Du jeweils immer einen Datensatz ein steht der Lesezeiger auf dem nächsten Byte hinter dem Datensatz. Liest Du einen weiteren Datensatz fängt der Lesevorgang an der Position an wo der Lesezeiger hinzeigt. Die Anzahl der Datensätze erhälst Du so: Stream.size div Datensatzgröße. Grüße Klaus |
Re: untypisierte dateien
Zitat:
|
Re: untypisierte dateien
Zitat:
In diesem Stream kannst Du dann 544 mal lesen bis Du zum Streamende ankommst. Grüße Klaus |
Re: untypisierte dateien
Zitat:
|
Re: untypisierte dateien
Du machst eseinfach so:
Delphi-Quellcode:
Der Test von gelesen ist wichtig, da es keine Fehlermeldung bei Dateiende,fehlender zugriffsbereichtigung etc. gibt!
....
repeat gelesen:=fs.read(buffer,sizeof(buffer)); if gelesen:=sizeof(buffer) then begin { nur vollständig gefüllte Sätze verarbeiten } { Daten verarbeiten } test1:= myrecord.artnr ; test2:= myrecord.name ; test3:= myrecord.name2 ; test4:= myrecord.preis ; end; until gelesen<sizeof(buffer); { wenn nicht mehr genügend Daten gelesen werden ist schluß!} ... Gruß K-H |
Re: untypisierte dateien
ich danke euch
EDIT : auch das oemtochar zeigt Wirkung, sprich Umlaute funktionieren. War tatsächlich das fehlende SetLength. Gruss KH |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz