Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi komische TXT-Datei in Array auslesen (https://www.delphipraxis.net/33407-komische-txt-datei-array-auslesen.html)

robroy85 6. Nov 2004 15:04


komische TXT-Datei in Array auslesen
 
Hallo erstma!

Ich habe eine Txt-Datei mit folgendem Inhalt

///Anfang der Datei
Liste
Filter:

Handersen Horst Lars 05a
Behrensen Malte 05a
Biederichen Alina 06a
.... .... ...
///Ende der Datei

Der Inhalt der Datei soll in ein mehrdimensionales Array geschrieben werden (aber erst ab Zeile 3, bei Null angefangen zu Zählen )

Der Nachname hat genau 21 feste Zeichen zur Verfügung, dann kommt ein TAB, der Vorname hat 24 feste Zeichen, wieder ein TAB, die Klassenbezeichnung hat 7 feste Zeichen, dann gibs nen Zeilensprung -> nächster Datensatz

Ich hab mir die Formatierung nicht ausgesucht, aber so kommt es aus einem externen Programm
Wie mache ich daraus ein 2D-Array mit 3 Spalten ohne die ganzen überflüssigen Leerzeichen ?

ibp 6. Nov 2004 15:13

Re: komische TXT-Datei in Array auslesen
 
hallo willkommen bei dp :dp: ,

was hast du denn schon? was ist dein eigentliches problem?

gruß

Nikolas 6. Nov 2004 15:21

Re: komische TXT-Datei in Array auslesen
 
schau dir mal Delphi-Referenz durchsuchencopy und Delphi-Referenz durchsuchenpos an. Damit solltest du es machen können.

robroy85 6. Nov 2004 15:25

Re: komische TXT-Datei in Array auslesen
 
Also meine Funktion sollte folgendes machen:

1. zur Zeile 3 gehen
2. Zeichen 1 bis 21 auslesen -> Überflüssige Leerzeichen entfernen -> in Array speichern
3. über den Tab springen
4. Vorname auslesen und wie in 2. verfahren

.....


Gibt es dafür passende Befehle oder muss man sich erst Hilfsfunktionen schreiben?
Wie bewege ich mich in einem Text und kopiere daraus teile ohne die ganze Zeile zu kopieren?


Quelltext habe ich noch keinen zustande gebracht, die Suche über Google hat mir zwar viele andere Probleme gezeigt aber nicht bei meinemweitergeholfen, da es dort meist um einfachere Formatierungen mit ";" ging.


Freu mich auf jede Hilfe!

ibp 6. Nov 2004 15:27

Re: komische TXT-Datei in Array auslesen
 
hier gibt es eine wunderbare suche, da wirst du auch was finden...

lade die datei erst einmal in eine stringliste, dann sehen wir weiter...

dizzy 6. Nov 2004 15:29

Re: komische TXT-Datei in Array auslesen
 
Zitat:

Zitat von robroy85
da es dort meist um einfachere Formatierungen mit ";" ging.

Der Unterschied von ";" und " " ist ja nun nicht soooo groß, als dass man das nicht anpassen könnte ;)

robroy85 12. Nov 2004 09:41

Re: komische TXT-Datei in Array auslesen
 
hy community!

Nicht das ihr denkt ich wär schon wieder gestorben! Danke für die Hilfe, hat bei mir das Brett vom Kopf entfernt und hab mich dann gleich mal auf die Suche gemacht!Habs leider verpennt zu posten, aber das hol ich jetzt mal nach! Würd mich über Kritik freuen, vllt kann man ja noch was vereinfachen!

Hier ist mein TEST-quelltext:
Delphi-Quellcode:
function LeerzeichenSchneiden(folge: string ): string;
var laenge : integer;
begin
laenge:= Length(folge);
while Copy(folge,laenge,laenge)= ' ' do begin
laenge := laenge-1;
folge := Copy(folge,0,laenge);
end;     // end of while
result:= folge ;
end;

procedure TForm1.Button1Click(Sender: TObject);
var sl:TStrings;             //Variable für Stringlist definieren
 Zeile, Endzeile, Zname, Zvorname, Zklasse: integer;
 klassenbez: string ;

begin

sl:=TStringlist.Create;      //StringList erzeugen
sl.LoadFromFile('E:\...\schueler5a.txt'); //Die Zeilen einer Datei in eine Stringlist laden
//sl.Add('Hallo');             //eine Zeichenkette ans Ende der Stringlist hinzufügen
Zname := 20;      // Der Name geht von Zeichen 1-20 = 20 Zeichen   Zeichen 21 = TAB
Zvorname := 22 ;  // Der Vorname geht von Zeichen 22-43 = 22 Zeichen     Zeichen 44 TAB
Zklasse := 8 ;    // Die Klasse geht von 44 bis 51
Endzeile:= sl.count-1 ;  // Endzeile

For Zeile:= 3 to Endzeile do begin
StringGrid1.Cells[1,Zeile-2]:= LeerzeichenSchneiden( Copy(sl.strings[Zeile],1,Zname) );
StringGrid1.Cells[2,Zeile-2]:= LeerzeichenSchneiden( Copy(sl.strings[Zeile],22,Zvorname) );
klassenbez := LeerzeichenSchneiden( Copy(sl.strings[Zeile],45,Zklasse) );

StringGrid1.Cells[4,Zeile-2]:= copy(klassenbez,3,1);
if Copy(klassenbez,0,1) = '0' then
StringGrid1.Cells[3,Zeile-2]:= copy(klassenbez,2,1)
else
StringGrid1.Cells[3,Zeile-2]:= copy(klassenbez,1,2);


end; // end of For

sl.SaveToFile('datei.txt');  //Die Zeichenketten der Stringlist in Datei speichern

sl.free;

end;

leddl 12. Nov 2004 10:20

Re: komische TXT-Datei in Array auslesen
 
Servus!
2 kleine Tips für die Zukunft:
1) Was dir bisher keiner gesagt hat: Anstatt deiner "LeerzeichenSchneiden" kannste auch einfach "trim" benutzen. ;) Die Funktion schneidet sogar vorne und hinten alle Leerzeichen ab.
2) Wenn du den Code etwas formatierst, dann wird er gleich viel übersichtlicher. (Sprich: Jeden Block ein bißchen einrücken, also nach jedem Begin usw.)

Könnte dann also so aussehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sl:TStrings;             //Variable für Stringlist definieren
    Zeile, Endzeile, Zname, Zvorname, Zklasse: integer;
    klassenbez: string ;

begin
  sl:=TStringlist.Create;      //StringList erzeugen
  sl.LoadFromFile('E:\...\schueler5a.txt'); //Die Zeilen einer Datei in eine Stringlist laden
  //sl.Add('Hallo');             //eine Zeichenkette ans Ende der Stringlist hinzufügen
  Zname := 20;      // Der Name geht von Zeichen 1-20 = 20 Zeichen   Zeichen 21 = TAB
  Zvorname := 22 ;  // Der Vorname geht von Zeichen 22-43 = 22 Zeichen     Zeichen 44 TAB
  Zklasse := 8 ;    // Die Klasse geht von 44 bis 51
  Endzeile:= sl.count-1 ;  // Endzeile

  For Zeile:= 3 to Endzeile do
  begin
    StringGrid1.Cells[1,Zeile-2]:= trim( Copy(sl.strings[Zeile],1,Zname) );
    StringGrid1.Cells[2,Zeile-2]:= trim( Copy(sl.strings[Zeile],22,Zvorname) );
    klassenbez := trim( Copy(sl.strings[Zeile],45,Zklasse) );

    StringGrid1.Cells[4,Zeile-2]:= copy(klassenbez,3,1);
    if Copy(klassenbez,0,1) = '0' then
      StringGrid1.Cells[3,Zeile-2]:= copy(klassenbez,2,1)
    else
      StringGrid1.Cells[3,Zeile-2]:= copy(klassenbez,1,2);


  end; // end of For

  sl.SaveToFile('datei.txt');  //Die Zeichenketten der Stringlist in Datei speichern

  sl.free;

end;


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