![]() |
Re: Fremdes Datenformat einfach lesen in Delphi
Na das laedt man am besten erst mal in eine TStringList und zaehlt die Datensaetze durch.
Ich vermute mal das das die zwei Ziffern am Zeilenanfang Zeilenangaben/Elementangaben sind und das ein Uebergang auf einen neuen Datensatz durch eine kleinere Nummer angezeigt wird. Vermutlich impliziert die Nummer auch eine Typangabe fuer den Inhalt. Man kann also ein passendes Record definieren und nun ein "array of" dieses Records mit SetLength alloziieren. Vermutlich ist die Dokumentation mehr oder minder die Definition eines solchen Records. Nun klappert man die TStringList nochmal ab und uebertraegt die Daten in die Records. Da braucht man noch die Dokumentation die sagt ob Zeilen fehlen duerfen und was dann der Defaultwert ist. |
Re: Fremdes Datenformat einfach lesen in Delphi
Moin :-)
Warum so kompliziert :roll: Da es sich um ein reines Textfile handelt, kann man es doch so machen:
Delphi-Quellcode:
APDATA dürfte ein 'spezielles' Datenformat für Apotheken (Rote Liste für Medikamente etc) sein :gruebel:
procedure Auslesen;
var S: String; F: TextFile; begin Assign(F, Pfad_und_Name_der_Textdatei); Reset(F); while not Eof(F) do begin Readln(F, S); {hier weitere MAssnahmnen um den String anhand der Doku zu zerlegen und entsprechend neu abzuspeichern} end; CloseFile(F); end; |
Re: Fremdes Datenformat einfach lesen in Delphi
Das ist ein ineffizienter Weg. Man muss dazu ja dauernd neue Datensaetze alloziieren.
|
Re: Fremdes Datenformat einfach lesen in Delphi
Man könnte ja auch erstmal die Datensätze zählen, Speicher allocieren, an den Dateianfang springen und dann Einlesen ... 's wäre zumindestens sparsammer im Speicherverbrauch, dafür ließt man allerdings die Datei zweimal ein :roll:
|
Re: Fremdes Datenformat einfach lesen in Delphi
Zitat:
|
Re: Fremdes Datenformat einfach lesen in Delphi
Hallo.
Also ich bin schon ein Stück weitergekommen. Ich lese die Textdatei in eine StringList ein und verarbeite diese dann. Liste laden:
Delphi-Quellcode:
Verarbeiten:
procedure TForm1.Button1Click(Sender: TObject);
begin sl := TStringList.Create; sl.LoadFromFile('ADR_APO.UPD'); Memo1.Lines := sl; end;
Delphi-Quellcode:
Funktion um den Kopf zu lesen:
procedure TForm1.Button5Click(Sender: TObject);
var i: integer; zeile: string; begin DS.Open; i := 0; while i < sl.Count do begin zeile := sl.Strings[i]; Memo2.Lines.Add(zeile); if(zeile='00K') then begin // Kopfdefinition i := Lese_Kopf(i); end else if(zeile='00F') then begin i := Lese_Feld(i); end else begin Inc(i); end; end; end;
Delphi-Quellcode:
Für evtl. Verbesserungen bin ich immer offen.
{** KOPF LESEN ****************************************************************}
function TForm1.Lese_Kopf(posi: integer): integer; var i: integer; s, s1, prefix, zeile: string; begin // BEGIN Kopf-Record lesen for i := 1 to anzahl_felder_k do begin Inc(posi); zeile := sl[posi]; prefix := Copy(zeile,1,2); s := Copy(zeile,3,length(zeile)); if( prefix='01') then begin edF01.Text := s; end else if( prefix='02') then begin edF02.Text := s; end else if( prefix='03') then begin edF03.Text := s; end else if( prefix='04') then begin edF04.Text := s; end else if( prefix='05') then begin edF05.Text := s; end else if( prefix='06') then begin edF06.Text := s; end else if( prefix='07') then begin edF07.Text := s; end else if( prefix='08') then begin edF08.Text := s; anzahl_tabelle_felder := StrToInt(s); end; result := posi; end; // END Kopf-Record lesen end; {******************************************************************************} Habe ja bisher noch nie mit solchen Files gearbeitet. MfG, Ronny |
Re: Fremdes Datenformat einfach lesen in Delphi
Du könntest z.B. findComponet verwenden,
damit kannst Du dir die Aufzählung der Edit Componente (edF01, edF02 ..) sparen Grüße Klaus
Delphi-Quellcode:
{** KOPF LESEN ****************************************************************}
function TForm1.Lese_Kopf(posi: integer): integer; var i: integer; s, s1, prefix, zeile: string; begin // BEGIN Kopf-Record lesen for i := 1 to anzahl_felder_k do begin Inc(posi); zeile := sl[posi]; prefix := Copy(zeile,1,2); s := Copy(zeile,3,length(zeile)); TEdit(FindComponent('edF' + prefix)).text:=s; anzahl_tabelle_felder := StrToInt(s); end; result := posi; end; // END Kopf-Record lesen end; {******************************************************************************} |
Re: Fremdes Datenformat einfach lesen in Delphi
Stimmt. Das ist natürlich wesentlich einfacher :)
Gibt es eine Möglichkeit, das ich via ReadLn Blockweise aus dem Textfile lesen kann? Beispiel vom File: 00K 01ADR_APO 02UPD 0320060515 0420060501 05Testlieferant XYZ 06Adressen 071001 0815 00F 0101 02Key_ADR 031 040 05V 065 07NU1 00F 0102 02Firmenname 030 040 05V 0640 07AN1 Im Textfile gibt es mehrere Blöcke: 00K <- Beginn Kopfsatz (Dieser kommt nur einmal vor) 01(Dateiname) 02(Update oder Gesamtdatei) 03(Datum von) 04(Datum bis) 05(Lieferant) 06(Dateiname Lang) 07(Datei-ID 08(Anzahl der Felder) Danach kommen die Feld-Definitionen 00F <- Begin einer Felddefinition (können mehrmals vorkommen, pro Feld ein solcher Block) 01 \ 02 +--- Da stehen dann Feldname, Größe und so weiter 03 / 00D,00I,00U sind dann die Datensätze wobei D-Delete, I-Insert, U-Update ist 011449 Könne man dies nicht blockweise lesen und dann verarbeiten? Wenn ja wie kann man dies bewerkstelligen? |
Re: Fremdes Datenformat einfach lesen in Delphi
Da die Datei nicht Datensatz orientiert (indiziert) ist geht es
wohl nicht anders. Es sei denn die Zeilen sind alle gleich lang, dann könntest Du eine gewisse Byteanzahl einlesen. (BlockRead) Grüße Klaus |
Re: Fremdes Datenformat einfach lesen in Delphi
Also der Kopf ist immer 8 Zeilen Lang
die Felder-Defs sind immer 7 Zeilen lang und die Feldzeilenanzahl ergibt sich ja durch die anzahl der Felder |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 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