Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fremdes Datenformat einfach lesen in Delphi (https://www.delphipraxis.net/69489-fremdes-datenformat-einfach-lesen-delphi.html)

Robert Marquardt 16. Mai 2006 08:59

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.

raiguen 16. Mai 2006 10:27

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:
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;
APDATA dürfte ein 'spezielles' Datenformat für Apotheken (Rote Liste für Medikamente etc) sein :gruebel:

Robert Marquardt 16. Mai 2006 10:50

Re: Fremdes Datenformat einfach lesen in Delphi
 
Das ist ein ineffizienter Weg. Man muss dazu ja dauernd neue Datensaetze alloziieren.

himitsu 16. Mai 2006 11:16

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:

Hansa 16. Mai 2006 23:28

Re: Fremdes Datenformat einfach lesen in Delphi
 
Zitat:

Zitat von raiguen
{hier weitere MAssnahmnen um den String anhand der Doku zu zerlegen und entsprechend neu abzuspeichern}

So isset. Die "weiteren Maßnahmen" stehen oben in #3. Habe das vorweggenommen. Das wäre schon das Grundgerüst für das ganze Programm. Haken an der Sache ist, ob die Definition der alten Daten genau genug ist und ins eigene DB-Konzept paßt. Existiert die überhaupt schon ?

Berserker 27. Mai 2006 13:43

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
 sl := TStringList.Create;
 sl.LoadFromFile('ADR_APO.UPD');
 Memo1.Lines := sl;
end;
Verarbeiten:
Delphi-Quellcode:
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;
Funktion um den Kopf zu lesen:
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));
   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;
{******************************************************************************}
Für evtl. Verbesserungen bin ich immer offen.
Habe ja bisher noch nie mit solchen Files gearbeitet.

MfG, Ronny

Klaus01 27. Mai 2006 13:57

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;
{******************************************************************************}

Berserker 27. Mai 2006 14:18

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?

Klaus01 27. Mai 2006 14:30

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

Berserker 27. Mai 2006 14:32

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 22:35 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz