![]() |
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 |
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:
Und dann mit den TextFile Operationen AssignFile, Read, CloseFile. Da hab ich aber nicht so praktische Erfahrungen mit.
type
MyFileRecord = record CustNr: String[5]; Name: String[18]; ... end; |
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:
Grüsse Frank :coder:
{$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; |
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 |
Re: Textdatei ohne Trennzeichen verarbeiten
Oder über den ODBC-Text-Treiber und einer passenden Schema.ini ->
![]() cu Oliver |
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:
Die Definition der Arrays ist recht ungewöhnlich erleichtert Dir aber die Orientierung im Bezug auf die Quelldaten.
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; 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!) |
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 |
Re: Textdatei ohne Trennzeichen verarbeiten
Hallo Oliver,
der ODBC-Treiber ist eine interessante Idee, hast Du da Erfahrungen? Gruß K-H |
Re: Textdatei ohne Trennzeichen verarbeiten
naja wenn ADO fehlt (bei D7 Personal) ist die ODBC-Lösung nicht das wahre.
Gruß K-H |
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 -.- |
Re: Textdatei ohne Trennzeichen verarbeiten
Zitat:
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:
Frank :zwinker:
var
Zeile, Kundenname : Shortstring; begin ... Readln(f,Zeile); Move(Zeile[6],Kundenname[1],18); Kundenname[0] := #18; end; |
Re: Textdatei ohne Trennzeichen verarbeiten
Oder nimm einfach:
Delphi-Quellcode:
Grüsse Frank :mrgreen:
{$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; |
Re: Textdatei ohne Trennzeichen verarbeiten
Zitat:
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 |
Re: Textdatei ohne Trennzeichen verarbeiten
oh mann .... irgendwie stehe ich heute aufn Schlauch :(
Ich versteh nicht, warum mann das braucht:
Delphi-Quellcode:
wenn man später das macht:
type
TAdresse = record Kundennummer : String[5]; Kundenname : String[18]; Strasse : String[13]; end;
Delphi-Quellcode:
Ich dachte auch das ich evtl. mit AssignFile arbeiten muss ... weil die .txt Datei auf dem Server liegt ...
Kundennummer := Copy(Zeile,1,5);
Kundenname := Copy(Zeile,6,18); Strasse := Copy(Zeile,39,Sizeof(Strasse)-1); // oder so C:\Temp\personal.txt (Beispielpfad) |
Re: Textdatei ohne Trennzeichen verarbeiten
![]() Ich weise einer Datei-Variablen eine Datei zu.
Delphi-Quellcode:
var
ZeigerAufDatei : Text; begin AssignFile( ZeigerAufDatei, 'C:\Der\Pfad\zu\meiner\Datei.txt' ); ... end; |
Re: Textdatei ohne Trennzeichen verarbeiten
oder die ganz banale Methode (ist für Anfänger oft leichter zu verstehen)
Delphi-Quellcode:
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.
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); 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. |
Re: Textdatei ohne Trennzeichen verarbeiten
Ja Sir Rufo,
habs bissl blöd formuliert, sorry |
Re: Textdatei ohne Trennzeichen verarbeiten
Zitat:
Im übrigen lässt sich das auch ohne ADO mit passender INI lösen, z.B. so:
Delphi-Quellcode:
Dann kann man sich die Positionen im Programm auch ausrechnen.
[Feldlaengen]
Kundennummer=5 Vollername=19 Strasse=14 etc. |
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 ^^ |
Re: Textdatei ohne Trennzeichen verarbeiten
Delphi-Quellcode:
Edit: reset hat gefehlt
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); |
Re: Textdatei ohne Trennzeichen verarbeiten
Hallo,
eine nette Variante, Urpascal und gut wartbar, da die Definition im Record steckt:
Delphi-Quellcode:
Setztz voraus, dass keine NUL-Char in der Zeile, wäre auch seltsam.
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; Gruss Reinhard |
Re: Textdatei ohne Trennzeichen verarbeiten
Zitat:
Kann mich nicht erinnern ... :gruebel: ganz abgesehen, dass
Delphi-Quellcode:
schon ein bisschen kryptisch ist, oder?
StrPLCopy (Adresse.KNummer,High(Adresse.KNummer));
|
Re: Textdatei ohne Trennzeichen verarbeiten
Zitat:
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 |
Re: Textdatei ohne Trennzeichen verarbeiten
Zitat:
Zitat:
PS: zum Thema kryptisch kann ich Brainfuck empfehlen, hier ein Sourcecode-Auszug in strukturierter Form:
Delphi-Quellcode:
[-<<<<<<<<<<<+>>>>>>>>>>>]
>>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<< [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<< [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<] >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>> [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<< [<<<<<<<<<<]>>>>>>>>>> >>>>>> |
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