Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textdatei ohne Trennzeichen verarbeiten (https://www.delphipraxis.net/128964-textdatei-ohne-trennzeichen-verarbeiten.html)

Bali 10. Feb 2009 10:12


Textdatei ohne Trennzeichen verarbeiten
 
Hallo zusammen,

ich habe folgendes Problem:
1. bin ich erst vor kurzen in die Delphi Welt geworfen worden :)

2. jetzt muss ich ein Programm abändern das in meinen Augen nicht so leicht wird, bzw. hab ich schon viel gegoogled und hab nichts brauchbares gefunden :(

In dem Programm hab ich bis heute eine *.dbf Datei eingelesen und verarbeitet, hab auch den Quelltext sehr gut verstanden.
Aber nun werden wir ein neues System bekommen und wir werden nur noch einen TextFile bekommen, der in etwa so aussieht:

00099Max Mustermann Holzweg 43 002300 etc .......

Ich muss jetzt quasi den TextFile ohne Trennzeichen verarbeiten.

Zur Info:
Stringstellen--Bedeutung
1-5 ------------ Kundennummer
6 - 24 --------- Vor und Nachname
25 - 38 -------- Straße
39 - 44 -------- Gehalt

Meine Frage ist jetzt, wie kann ich den File am besten bearbeiten ?

Um noch genauere Informationen zu geben,
das sind etwa 40 verschiedene Daten in einer Zeile und der File wird recht groß sein.
Jede Zeile soll gelesen werden und jeder Wert sollte in einer Variable stehen um ihn zu verarbeiten können.

Beispiel meiner Vorstellung:

TextFile lesen bis EoF
-- Variable1 := Kundennummer
-- Variable2 := Vor und Nachname
-- ect........

-- Abfrabe auf Kundennummern (es dürfen nur Kundennummern zwischen 00001 und 001000)
---- Daten verarbeiten

nächste Zeile lesen

Hoffe es ist einigermaßen verständlich was ich meine und das mir bitte einer helfen kann.

Dankeschön
Bali

nuclearping 10. Feb 2009 10:20

Re: Textdatei ohne Trennzeichen verarbeiten
 
Wenn alle Einträge fixe Längen haben, kannst du sie entweder als Stringliste einlesen und dann mit den Stringfunktionen "Copy" arbeiten.
Oder du machst eine typisierte Datei über "File of MyFileRecord", wo du den Record mit den Längen der Datensätze deklarierst.
Delphi-Quellcode:
type
  MyFileRecord = record
    CustNr: String[5];
    Name: String[18];
    ...
  end;
Und dann mit den TextFile Operationen AssignFile, Read, CloseFile. Da hab ich aber nicht so praktische Erfahrungen mit.

Mavarik 10. Feb 2009 10:22

Re: Textdatei ohne Trennzeichen verarbeiten
 
Hi!

Also zu Fuß oder einfach es gibt sicherlich 100 Ansätze..

Wir wäre es mit einem Record
Delphi-Quellcode:
{$A1}
TAdresse = Record
              KNR : array[0..5] of char
              KundenName : array[0..18] of char;
           end;

var
  Zeile : String;
  F    : Textfile;
  Adresse : TAdresse;

begin
  Readln(F,Zeile);
  Move(Zeile[1],Adresse,sizeof(Adresse));
end;
Grüsse Frank :coder:

Bali 10. Feb 2009 10:32

Re: Textdatei ohne Trennzeichen verarbeiten
 
Geht ja superschnell hier :) Dankeschön schon mal.

Also, die Text Datei wird immer gleich bleiben in Sachen Record Länge, sie kann nur von der Anzahl der Records sich ändern.

Ok, Ok ... soweit habe ich eure Idee verstanden, find ich auch sehr gut.

Nur stell ich mir jetzt die Fragen ....

1. Wo bitte genau muss ich den Record definieren ?
zwischen Procedure TextDatei.test
und
var ?

2. Das mit dem Record erstellen hab ich verstanden, das mit den var ein bisschen, aber das mit den Readln nicht so gut :(
muss ich dann einen Zähler noch einbauen ?!

MfG
Bali

Sir Rufo 10. Feb 2009 10:32

Re: Textdatei ohne Trennzeichen verarbeiten
 
Oder über den ODBC-Text-Treiber und einer passenden Schema.ini -> http://msdn.microsoft.com/en-us/library/ms709353.aspx

cu

Oliver

p80286 10. Feb 2009 10:33

Re: Textdatei ohne Trennzeichen verarbeiten
 
Hallo Bali,

ich schlage Dir folgendes vor
a) einlesen der Textdatei und überprüfung der Satzlänge, rein theoretisch müssten alle Sätze gleich lang sein.

b) Definition eines Records und eines Lesebuffers:
Delphi-Quellcode:
Const
  maxsatzlang= 44+2; {satzlänge+2 CRLF }
Type
    tDatensatz : record
      Kundennummer = array [1..5] of char;
      Name        = array [6..24] of char;
      ...

Var
 Lesezeile : array [1..maxsatzlang];
 LeseSatz : tDatensatz;
Die Definition der Arrays ist recht ungewöhnlich erleichtert Dir aber die Orientierung im Bezug auf die Quelldaten.
Es spricht natürlich nichts dagegen 0 oder 1 basiert zu arbeiten.

b) danach einlesen jeweils eines Satzes(x Byte+2 [CRLF] ) oder mehrerer Sätze(n*(xByte+2))
c) move(Lesezeile[1],Lesesatz,maxsatzlang);

Danach stehen Dir alle Felder innerhalb eines Records zur Verfügung.

b & c müssen natürlich vom Anfang der Datei bis zum bitteren Ende mehrfach ausgeführt werden.

Es spricht natürlich nichts dagegen das alles objektorientiert zu definieren, insbesonders im Hinblick auf spätere Wartung.
Ich hoffe das hilft Dir weiter.

Gruß K-H

(ich tippe einfach zu langsam!)

Sir Rufo 10. Feb 2009 10:36

Re: Textdatei ohne Trennzeichen verarbeiten
 
hmmm, glaubt ihr wirklich, dass das einfacher ist, als eine Schema.ini anzulegen und dann mit TADOTable / TADOQuery darauf zuzugreifen?

Einziger Nachteil bei diesem Zugriff: Read-Only!

cu

Oliver

p80286 10. Feb 2009 10:37

Re: Textdatei ohne Trennzeichen verarbeiten
 
Hallo Oliver,

der ODBC-Treiber ist eine interessante Idee,
hast Du da Erfahrungen?

Gruß
K-H

p80286 10. Feb 2009 10:39

Re: Textdatei ohne Trennzeichen verarbeiten
 
naja wenn ADO fehlt (bei D7 Personal) ist die ODBC-Lösung nicht das wahre.

Gruß K-H

Bali 10. Feb 2009 10:40

Re: Textdatei ohne Trennzeichen verarbeiten
 
@ Sir Rufo

Ich muss die Datei auch nur lesen.

Das mit dem Record erstellen finde ich eigentlich recht gut, nur steig ich da nicht ganz durch :(

Sorry, bin halt noch kein erfahrener Delphi Programmierer -.-

Mavarik 10. Feb 2009 10:42

Re: Textdatei ohne Trennzeichen verarbeiten
 
Zitat:

Zitat von Sir Rufo
hmmm, glaubt ihr wirklich, dass das einfacher ist, als eine Schema.ini anzulegen und dann mit TADOTable / TADOQuery darauf zuzugreifen?
cu

Oliver

Achherje...

Naja warum auch nicht... 10.000 Anweisung und Treiber für ein Problem welches sich mit einem simplen Move lösen läßt!
Delphi-Quellcode:
var
  Zeile, Kundenname : Shortstring;
begin
...
  Readln(f,Zeile);

  Move(Zeile[6],Kundenname[1],18);
  Kundenname[0] := #18;
end;
Frank :zwinker:

Mavarik 10. Feb 2009 10:48

Re: Textdatei ohne Trennzeichen verarbeiten
 
Oder nimm einfach:
Delphi-Quellcode:
{$A1}
type
  TAdresse = record
               Kundennummer : String[5];
               Kundenname  : String[18];
               Strasse     : String[13];
             end;

var
  Zeile : String;
  f    : Textfile;
  Adresse : TAdresse;
begin
  While not(eof(f)) do
    begin
      readln(f,Zeile);
      with Adresse do
        begin
          Kundennummer := Copy(Zeile,1,5);
          Kundenname  := Copy(Zeile,6,18);
          Strasse     := Copy(Zeile,39,Sizeof(Strasse)-1); // oder so
        end;
    end;
end;
Grüsse Frank :mrgreen:

Sir Rufo 10. Feb 2009 10:56

Re: Textdatei ohne Trennzeichen verarbeiten
 
Zitat:

Zitat von Mavarik
Zitat:

Zitat von Sir Rufo
hmmm, glaubt ihr wirklich, dass das einfacher ist, als eine Schema.ini anzulegen und dann mit TADOTable / TADOQuery darauf zuzugreifen?
cu

Oliver

Achherje...

Naja warum auch nicht... 10.000 Anweisung und Treiber für ein Problem welches sich mit einem simplem Move lösen läßt!
Delphi-Quellcode:
var
  Zeile, Kundenname : Shortstring;
begin
...
  Readln(f,Zeile);

  Move(Zeile[6],Kundenname[1],18);
  Kundenname[0] := #18;
end;
Frank :zwinker:

Wenn ich mit dem programm flexibel bleiben möchte, dann ändere ich die Schema.ini, wenn sich die Spaltenbreiten ändern, ohne Programmierung.
Und ansonsten kümmer ich mich nur um die Verarbeitung der Sätze, die mir mundgerecht schon als einzelner Record geliefert werden.

Einschränkung der Datensätze mittels SQL-Befehlen (via TADOQuery)

Ob das Nachteile sind? Gut, wenn kein ADO vorhanden ... dann bleibt nur die Record-Variante ... aber muss ich mich als Programmierer um alles kümemrn ... oder darf ich auch Vorhandenes benutzen?

cu

Oliver

Bali 10. Feb 2009 10:58

Re: Textdatei ohne Trennzeichen verarbeiten
 
oh mann .... irgendwie stehe ich heute aufn Schlauch :(

Ich versteh nicht, warum mann das braucht:

Delphi-Quellcode:
type
  TAdresse = record
               Kundennummer : String[5];
               Kundenname  : String[18];
               Strasse     : String[13];
             end;
wenn man später das macht:

Delphi-Quellcode:
Kundennummer := Copy(Zeile,1,5);
          Kundenname  := Copy(Zeile,6,18);
          Strasse     := Copy(Zeile,39,Sizeof(Strasse)-1); // oder so
Ich dachte auch das ich evtl. mit AssignFile arbeiten muss ... weil die .txt Datei auf dem Server liegt ...

C:\Temp\personal.txt (Beispielpfad)

Sir Rufo 10. Feb 2009 11:04

Re: Textdatei ohne Trennzeichen verarbeiten
 
Delphi-Referenz durchsuchenAssignFile hat aber nix damit zu tun, dass eine Datei auf einem Server liegt!

Ich weise einer Datei-Variablen eine Datei zu.

Delphi-Quellcode:
var
  ZeigerAufDatei : Text;
begin
  AssignFile( ZeigerAufDatei, 'C:\Der\Pfad\zu\meiner\Datei.txt' );
  ...
end;

globetrotter77 10. Feb 2009 11:05

Re: Textdatei ohne Trennzeichen verarbeiten
 
oder die ganz banale Methode (ist für Anfänger oft leichter zu verstehen)

Delphi-Quellcode:
assignfile(eingabedatei,'hier kommt der Dateiname hin');
reset(eingabedatei);

while not eof(eingabedatei) do
begin
  readln(eingabedatei, eingabezeile);
  kundennummer:=trim(copy(eingabezeile, 1, 5));
  vollername:=trim(copy(eingabezeile, 6, 19));
  strasse:=trim(copy(eingabezeile, 25, 14));
  etc.
end;

closefile(eingabedatei);
Bei der Copy-Funktion musst du als Parameter die erste Position und die Länge übergeben, die musst du also einmal für alle Felder ausrechnen.
Die Trim-Funktion sollte man nicht vergessen, weil man sich sonst lauter überflüssige Leerstellen in die Daten reinholt.
Auf diese Art erhält man die Daten jeweils in String-Format. Falls numerische oder Datums-Angaben enthalten sind, müssen diese noch entsprechend umgewandelt werden!

PS: das mit dem Record funktioniert nur, wenn du Arrays verwendest. Dann musst du aber auch noch mal rumschieben, um die Daten auch auswerten zu können.
Bei Strings in der Record-Definition fällst du auf die Nase ... das liegt an dem Längenbyte, das auch Mavarik schon angesprochen hat (ansprechbar mit stringname[0]) ... dieses ist aber in der Eingabedatei nicht enthalten.

Bali 10. Feb 2009 11:09

Re: Textdatei ohne Trennzeichen verarbeiten
 
Ja Sir Rufo,

habs bissl blöd formuliert, sorry

globetrotter77 10. Feb 2009 11:11

Re: Textdatei ohne Trennzeichen verarbeiten
 
Zitat:

Zitat von Sir Rufo
Wenn ich mit dem programm flexibel bleiben möchte, dann ändere ich die Schema.ini, wenn sich die Spaltenbreiten ändern, ohne Programmierung.
Und ansonsten kümmer ich mich nur um die Verarbeitung der Sätze, die mir mundgerecht schon als einzelner Record geliefert werden.

Damit hast du natürlich recht, aber man darf die Leute auch nicht überfordern!
Im übrigen lässt sich das auch ohne ADO mit passender INI lösen, z.B. so:
Delphi-Quellcode:
[Feldlaengen]
Kundennummer=5
Vollername=19
Strasse=14
etc.
Dann kann man sich die Positionen im Programm auch ausrechnen.

Bali 10. Feb 2009 11:13

Re: Textdatei ohne Trennzeichen verarbeiten
 
Super Globetrotter77 !

Sowas habe ich gesucht :)

da hätte ich jetzt nur noch eine Frage, wie ich die eingabedatei definiere ?

string oder ?

Dankeschön euch allen, ich probiers gleich mal aus und gebe noch einmal ein Feedback ^^

globetrotter77 10. Feb 2009 11:15

Re: Textdatei ohne Trennzeichen verarbeiten
 
Delphi-Quellcode:
var eingabedatei: TextFile;
  eingabezeile: string;
  kundennummer: string;
begin
  assignfile(eingabedatei,'test.txt');
  reset(eingabedatei);
  while not eof(eingabedatei) do
  begin
    readln(eingabedatei);
    kundennummer:=Trim(copy(eingabezeile,1 , 5));
    ...
  end;
  closefile(eingabedatei);
Edit: reset hat gefehlt

Reinhard Kern 10. Feb 2009 11:19

Re: Textdatei ohne Trennzeichen verarbeiten
 
Hallo,
eine nette Variante, Urpascal und gut wartbar, da die Definition im Record steckt:
Delphi-Quellcode:
type
  TAdresse = record case boolean of
               false : (DataString : string [maxdatalength]);
               true:  (KNummer : array [1..5] of char;
                        Kname  : array [1..18] of char;
                        KStrasse : array [1..13]) of char);
             end;

var
  f    : Textfile;
  Adresse : TAdresse;
  Kundennummer : string;
begin
  While not(eof(f)) do
    begin
      readln(f,Adresse.DataString);
      Kundennummer := StrPLCopy (Adresse.KNummer,High(Adresse.KNummer));
          {...}
    end;
end;
Setztz voraus, dass keine NUL-Char in der Zeile, wäre auch seltsam.

Gruss Reinhard

globetrotter77 10. Feb 2009 11:24

Re: Textdatei ohne Trennzeichen verarbeiten
 
Zitat:

Zitat von Reinhard Kern
Hallo,
eine nette Variante, Urpascal und gut wartbar, da die Definition im Record steckt:
Delphi-Quellcode:
type
  TAdresse = record case boolean of
               false : (DataString : string [maxdatalength]);
               true:  (KNummer : array [1..5] of char;
                        Kname  : array [1..18] of char;
                        KStrasse : array [1..13]) of char);
             end;

var
  f    : Textfile;
  Adresse : TAdresse;
  Kundennummer : string;
begin
  While not(eof(f)) do
    begin
      readln(f,Adresse.DataString);
      Kundennummer := StrPLCopy (Adresse.KNummer,High(Adresse.KNummer));
          {...}
    end;
end;
Setztz voraus, dass keine NUL-Char in der Zeile, wäre auch seltsam.

Gruss Reinhard

StrPLCopy gab es schon im Ur-Pascal???
Kann mich nicht erinnern ... :gruebel:
ganz abgesehen, dass
Delphi-Quellcode:
StrPLCopy (Adresse.KNummer,High(Adresse.KNummer));
schon ein bisschen kryptisch ist, oder?

Reinhard Kern 10. Feb 2009 12:30

Re: Textdatei ohne Trennzeichen verarbeiten
 
Zitat:

Zitat von globetrotter77
StrPLCopy gab es schon im Ur-Pascal???
Kann mich nicht erinnern ... :gruebel:
ganz abgesehen, dass
Delphi-Quellcode:
StrPLCopy (Adresse.KNummer,High(Adresse.KNummer));
schon ein bisschen kryptisch ist, oder?

Hi,

StrIrgendwas ist ja kein Sprachbestandteil, sondern eine Library-Funktion, die man sich bei Bedarf in ein paar Minuten selbst zusammentippen kann, angenehm aber nicht notwendig. Auch wenn sich das mancher Neuprogrammierer nicht mehr vorstellen kann, es gab grosse und professionell strukturierte Software auch schon vor VCL und MFC.

Aber darum gings garnicht, ich finde nur dass die Möglichkeit von record case zu Unrecht völlig in Vergessenheit geraten ist. Ich habe das schon vor Jahrzehnten zur Umwandlung von z.B. Realzahlen in 4 Bytes usw. benutzt, es gibt ja nicht für alle Fälle vorgefertigte Funktionen wie Hi oder Lo, wenn überhaupt (etwa in Z80-Pascal selig). Jeder benutzt halt, was er kennt, und case records gehören wohl nicht mehr dazu.

Und wenn du was WIRKLICH kryptisches sehen willst, musst du C++ verwenden. Der von mir gewählte Zugriff hat jedenfalls den Vorteil, dass man dazu die einzelnen Stringlängen nicht mehr im Kopf oder sonstwo haben muss und entsprechende Änderungen nur an einer Stelle notwendig sind. Dass das für die Wartung seine Vorteile hat, ist inzwischen auch in Vergessenheit geraten. Fast alle Vorschläge hier stecken die Definition in Trim oder Copy Funktionen mitten im Programm (und in der Praxis dann noch an mehreren Stellen, z.B. zum Lesen und Schreiben).

Gruss Reinhard

globetrotter77 10. Feb 2009 12:42

Re: Textdatei ohne Trennzeichen verarbeiten
 
Zitat:

Zitat von Reinhard Kern
Und wenn du was WIRKLICH kryptisches sehen willst, musst du C++ verwenden.

Da muss ich dir natürlich recht geben!
Zitat:

Der von mir gewählte Zugriff hat jedenfalls den Vorteil, dass man dazu die einzelnen Stringlängen nicht mehr im Kopf oder sonstwo haben muss und entsprechende Änderungen nur an einer Stelle notwendig sind. Dass das für die Wartung seine Vorteile hat, ist inzwischen auch in Vergessenheit geraten.
Allerdings! Leider!


PS: zum Thema kryptisch kann ich Brainfuck empfehlen, hier ein Sourcecode-Auszug in strukturierter Form:
Delphi-Quellcode:
    [-<<<<<<<<<<<+>>>>>>>>>>>]
      >>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<<
    [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<<
              [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<]
    >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>>
    [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<<
    [<<<<<<<<<<]>>>>>>>>>>
    >>>>>>

Bali 10. Feb 2009 14:18

Re: Textdatei ohne Trennzeichen verarbeiten
 
Hurra !

Hab zwar noch ein paar Probleme mit Integer und String Werten aus dem TextFile, aber das bekomme ich schon hin ;)

Recht herzlichsten Dank euch allen !!!

MfG

Bali


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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