AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Verarbeitung einer strukturierten Textdatei
Thema durchsuchen
Ansicht
Themen-Optionen

Verarbeitung einer strukturierten Textdatei

Offene Frage von "TN0"
Ein Thema von TN0 · begonnen am 10. Apr 2006 · letzter Beitrag vom 12. Apr 2006
Antwort Antwort
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#1

Verarbeitung einer strukturierten Textdatei

  Alt 10. Apr 2006, 10:28
Hallo zusammen,

ich habe folgendes Problem und wollte mal nachfragen, ob jemand eine gute Idee dazu hat.

Also:
Ich habe eine Textdatei mit Datensätzen drin.
Diese Textdatei wurde mit Fortran erstellt und weist demnach eine bestimmte Formatierung auf.
Ich möchte nun diese Textdatei mit Delphi einlesen, die Daten aufs Fromular bringen (in Edit Felder) und geänderte bzw. alle Daten im gleichen Format wieder abspeichern.

Meine Überlegung ist dies mit Records zu lösen, in denen ich jedem Datenteil die anzahl der Zeichen zuordne.

So sieht meine Überlegung für die erste Zeile zum Beispiel aus:
Delphi-Quellcode:
type
  TMyDaten = packed record
    Auftr : array[0..9]of char; //Auftragsnummer
    Dum1 : array[0..7]of char; //Dummy (Wird nicht verwendet)
    ProgNr : array[0..7]of char; //Programmnummer
    ZeichNr : array[0..7]of char; //Zeichnungsnummer
    LineNr : array[0..7]of char; //Lineelement
    Dum2 : array[0..7]of char; //Dummy (Wird nicht verwendet)
    Dum3 : array[0..7]of char; //Dummy (Wird nicht verwendet)
    Dum4 : array[0..7]of char; //Dummy (Wird nicht verwendet)
    AVO : array[0..7]of char; //AVO
    Mach : array[0..7]of char; //Maschine
    Durchm : array[0..7]of char; //Raddurchmesser
    AusWink : array[0..7]of char; //Austrittswinkel
    AnzScha : array[0..7]of char; //Anzahl Schaufeln
    SchaHohe: array[0..7]of char; //Schaufelhöhe
  end;
Ich weiss nun nicht, ob es besser ist, die Datei direkt in den Record zu laden oder ob man besser erst die Datei in eine Stringlist lädt und von da aus jede Zeile extra in die Records einliest.
Und ob man besser die Datensätze in einem Record ablegt oder ob man für jede Zeile einen eigenen Record anlegt.
Das Problem ist nämlich, dass bestimmte Zeilen variabel in der Länge sind. D.h. das mal mehr oder mal weniger Datensätze in einer Zeile sind.

Ich habe auch mal die Textdatei mit angehängt, damit man sich auch ein Bild davon machen kann.

Da sind unter einer Zeile mit 15 Datensätzen nämlich 3 Zeilen mit 5 Datensätzen Nullen angeordnet, die sind nur Platzhalter für weitere Datensätze der vorangegangen Zeile.


Ich hoffe es ist halbwegs verständlich worauf ich hinaus will und bin für jeden Denkansatz dankbar.
Also wie würdet ihr das lösen ?


mfg
TNO
Angehängte Dateien
Dateityp: txt test_119.txt (3,7 KB, 37x aufgerufen)
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Verarbeitung einer strukturierten Textdatei

  Alt 10. Apr 2006, 15:20
Herzlich willkommen in der Delphi-PRAXiS, TN0.

FORTRAN oder COBOL - genau so sieht das Datenmaterial aus. Wenn ich solche Daten mit Pascal im Batch-Modus verarbeiten müsste, dann würde ich mir auch record types deklarieren. Zusätzlich würde ich mir für jeden record type einen passenden pointer type deklarieren:

Delphi-Quellcode:
type
  PMyDaten = ^TMyDaten;
  TMyDaten = packed record
    Auftr : array[0..9]of char; //Auftragsnummer
    // ...
    SchaHohe: array[0..7]of char; //Schaufelhöhe
  end;
Jetzt kann ich die Daten zeilenweise verarbeiten:

Delphi-Quellcode:
procedure TDemoForm.Button3Click(Sender: TObject);
var
  tf: TextFile;
  MyDaten: PMyDaten;
  line, s, fmt: String;
  i: Integer;
begin
  AssignFile(tf, 'c:\daten\dp\tno.test.txt');
  Reset(tf);
  ReadLn(tf, line);
  MyDaten := Addr(line[1]);
  i := StrToInt(Trim(MyDaten.Dum2)) + 1;
  fmt := Format('%%%dd', [SizeOf(MyDaten.Dum2)]);
  s := Format(fmt, [i]);
  Move(s[1], MyDaten.Dum2, Length(s));
  ShowMessage(line);
  CloseFile(tf);
end;
Sollte keine Batch-Verarbeitung stattfinden, dann würde ich wohl eher Klassen anstelle von Records deklarieren.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Verarbeitung einer strukturierten Textdatei

  Alt 11. Apr 2006, 11:33
Hi marabu,

erstmal schönen Dank für die nette Begrüssung und für die hilfreiche Antwort.

Ich hab da direkt mal ein paar Fragen zu deinem Posting.

Also wäre es besser(schneller) die Daten zeilenweise zu verarbeiten ?
Und demnach für jede Zeile einen eigenen Record ?
Ist eine Batch-Verarbeitung in dem Fall hier auch von der Ausführung her schneller ?


mfg
TNO
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Verarbeitung einer strukturierten Textdatei

  Alt 11. Apr 2006, 13:53
Hi TNO,

Zitat von TNO:
Also wäre es besser(schneller) die Daten zeilenweise zu verarbeiten ?
nach deiner Beschreibung sind die Daten variabel lange Textzeilen. Da bietet sich eine zeilenweise Verarbeitung an. Ich würde da auch ohne Skrupel auf die TextFile-Funktionalität von Delphi zurückgreifen. Mittels SetTextBuf() kann der 128 Byte Standardpuffer auf eine angemessene Größe gesetzt werden.

Zitat von TNO:
Und demnach für jede Zeile einen eigenen Record ?
Nicht für jede Zeile, sondern für jeden Zeilentyp.

Zitat von TNO:
Ist eine Batch-Verarbeitung in dem Fall hier auch von der Ausführung her schneller ?
Batch bedeutet, dass beim Starten des Programms alle Steuerinformationen mitgegeben werden. Im Gegensatz zu GUI-Programmen, wo der Benutzer jederzeit die Kontrolle über den Verlauf der Verarbeitung hat bzw. haben soll. Ich vermute, dass batch processing die angemessene Art der Verarbeitung für deine Daten ist - aber wer kann das besser beurteilen als du?

marabu
  Mit Zitat antworten Zitat
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Verarbeitung einer strukturierten Textdatei

  Alt 11. Apr 2006, 14:17
Hi marabu,

ich glaube, dass in meinem Fall dann Batch-Verarbeitung nicht so elegant ist.
Da ich ja ein Programm mit GUI erstellen möchte. (Das Original Programm ist in Fortran geschrieben und nur als Konsole zu bedienen.)

Mein Programm soll also per Button die Daten-Textdatei einlesen und die Daten in die Edit-Felder und in ein Stringgrid des Formulars bringen. Dort kann man sie dann editieren und wieder abspeichern.

Also wenn ich es richtig verstanden habe, dann wäre hierbei eine Lösung mit Klassen besser, oder ?


mfg
TNO
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Verarbeitung einer strukturierten Textdatei

  Alt 11. Apr 2006, 17:45
Du bist auf jeden Fall frei in der Wahl deiner Mittel - Klasse oder Record. Object Pascal ist ja eine Hybridsprache. Kommt halt drauf an, was dir locker von der Hand geht, wie umfangreich das Programm wird und anderes mehr. Ich könnte mir vorstellen, dass die Zugriffsmethoden, in eine Klasse pro Zeilentyp verpackt, eine angenehme Lösung darstellen. Du wirst mit einem Zeilentyp anfangen wollen und vielleicht beide Wege implementieren um zu sehen, was dir besser gefällt.

marabu
  Mit Zitat antworten Zitat
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: Verarbeitung einer strukturierten Textdatei

  Alt 12. Apr 2006, 08:32
Moin marabu,

ich hab mir das alles nochmal in Ruhe durch den Kopf gehen lassen und habe dadurch eine unruhige Nacht gehabt.

Du bist mir bisher schon eine grosse Hilfe gewesen, nur ich steh nun wieder vor einem Problem und ich hoffe du bist so nett und hilfst mir dabei noch ein wenig.

Ich möchte die Daten nun über eine Klasse einlesen, da das hierbei wohl das sinnvollste ist.
Ich hatte am anfang nämlich etwas nicht bedacht.

Das Problem ist, dass ich von diesen Fortran Text-Datensätzen (sind mehrere Tausend) abhängig vom Erstellungs Datum unterschiedliche Formate habe.
D.h. dass der Record für Zeile 1 zum Beispiel von einem vor dem 22.01.04 erstellten Datensatz anders aussieht als von einem heute erstellten. Es gäbe also 6 Verschiedene Record Typen zu deklarieren.
Es sind nämlich die Formate mal von Zeit zu Zeit geändert worden oder was hinzugefügt worden.
Deswegen ist es hierbei doch eigentlich besser das über Klassen zu lösen, oder ?
Nur ich hab jetzt grad noch keinen Ansatz wie man das umsetzt. Hab mich bisher noch nicht mit Klassen beschäfigt.
Wäre sehr nett, wenn mir da jemand ein wenig helfen kann.

Kann mir der Thread hier LINK vielleicht auch schon helfen ?

Vielen Dank schonmal


mfg
TNO
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Verarbeitung einer strukturierten Textdatei

  Alt 12. Apr 2006, 18:24
Hallo TNO.

Während deine Daten bei der Batch-Verarbeitung in serieller Folge verarbeitet werden, ermöglicht die interaktive Verarbeitung in einer GUI-Anwendung den wahlfreien Zugriff. Es ist dann eher selten, dass alle Daten in einer Sitzung verarbeitet werden. Demzufolge muss die Unterscheidung von bereits bearbeiteten und noch zu bearbeitenden Daten möglich sein. Bei einer Stapelverarbeitung wird da klassisch aus einer Eingabedatei und einer Steuerdatei eine Ausgabedatei und eine modifizierte Eingabedatei erstellt. Dadurch werden keine Zeitstempel in den Daten gebraucht.

Muss die externe Repräsentation deiner Daten aus deinem Beispiel beibehalten werden - z.B. weil auch andere Programme diese Dateischnittstelle verwenden? Wenn ja und wenn keine Zeitstempel vorgesehen sind, dann wirst du eventuell das oben beschriebene Batch-Modell adaptieren müssen.

Klassen zu entwerfen, die lediglich eine zeilenweise Verarbeitung gestatten, kann nicht dein Ziel sein. Du wirst die Daten analysieren müssen und dabei ein Datenmodell entwickeln, wie es im Bereich relationaler Datenbanksysteme üblich ist. Aus diesem Datenmodell leitest du dann deine Klassen ab. Die interne Repräsentation der Daten unterscheidet sich in der Regel sehr stark von der externen.

Bist du sicher, dass die reine Stapelverarbeitung nicht die bessere Lösung ist? Ich habe es schon erlebt, dass Kollegen einen sauberen Batch-Prozess zerstört haben, nur weil sie unbedingt ein GUI erschaffen wollten. Sowas zieht gewaltige Änderungen an den Arbeitsabläufen nach sich.

marabu
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 Uhr.
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