Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Strings zerlegen in 3 Stringlisten (https://www.delphipraxis.net/89700-strings-zerlegen-3-stringlisten.html)

bluescreen25 4. Apr 2007 12:54


Strings zerlegen in 3 Stringlisten
 
Hallo, ich habe eine TXT-Datei in der wie ein kleines Telefonbuch je Zeile folgendes vorliegt:

...
Name,Nummer,Status
Name,Nummer,Status
...


im Prinzip brauche ich alle Namen, Nummern und Status in einzelne Stringlisten


hat jemand einen Ansatz ? Es ist auch möglich die TXT-Datei anders zu gestalten, wenn es zum Auslesen einfacher wird.


Gruß, bluescreen25

alzaimar 4. Apr 2007 13:11

Re: Strings zerlegen in 3 Stringlisten
 
Delphi-Quellcode:
Var s : TStringList;

Begin
  s := TStringlist.Create;
  s.Delimiter := ',';
  s.DelimitedText := 'a,b,c';
...
[edit] Ach nein, Du willst ja alle Namen in einer Liste haben.... Das würde mit einer Hilfsfunktion gehen. Ich habe so gelöst:

Delphi-Quellcode:
Function Split (Var S: String; Del: String): String;
Var
  p: Integer;

Begin
  p := pos(Del, S);
  If p = 0 Then Begin
    Result := s;
    s := '';
  End
  Else Begin
    Result := Copy(s, 1, p - 1);
    s := Copy(s, p + length(Del), length(s));
  End;
End;
Die Funktion schnippelt vom String 'S' alle Zeichen bis zum ersten Auftreten des Trennstrings 'Del' weg und liefert diesen Teilstring.

Delphi-Quellcode:
S :='abc,def';
X := Split (s,',');
In X ist nun 'abc' und in s dann 'def'. Das sollte dir reichen.

sharpals 4. Apr 2007 13:30

Re: Strings zerlegen in 3 Stringlisten
 
hallo, du benötigst pos( , delete( und eben deine listen.

Du definierst eine texdatei zum lesen.
Danach eine Liste

Z.B : liste :TStringList;

liste := array [0..2] of TStringList.Create; // Transferliste erzeugen
liste.Items.Clear; << lösche die liste

schleife in der du die datei liest
begin
extrahiere den wert >> wert
liste.Add(wert);
end liste zu ende

mach was mit der liste


und zuletzt

liste.free;
[delphi]
// ----------------------------------
var kette:array[0..2] of string;
index:byte
das ausschneiden bei dir sollte sein
for i:=0 to 1
do
begin
kette[I]:=copy(cline,1,pos(',',cline)-1); // ausschneiden und zuweisen
Delete(cLine, 1,pos(';',cline)); // aus der textzeile löschen
end;
kette[3]:=cline // rest
// ----------------------------------

bluescreen25 4. Apr 2007 15:48

Re: Strings zerlegen in 3 Stringlisten
 
Besten Dank für die Vorschläge, das hier konnte ich noch am schnellsten umsetzen:

Delphi-Quellcode:
procedure CreatePhone;
var i:integer;
    temp:string;
begin
  phoneFullLst := TStringList.Create;
  phoneNameLst := TStringList.Create;
  phoneNumberLst := TStringList.Create;
  phoneAreaLst := TStringList.Create;
 
  if FileExists(ProgrammPfad + '\tbook.txt') then
  phoneFullLst.LoadFromFile(ProgrammPfad + '\tbook.txt');

  for I:=0 to phoneFullLst.Count-1 do
  begin
    temp := phoneFullLst.strings[i];
    phoneNameLst.Add(SplitString(temp,','));            //nur Namen
    phoneNumberLst.Add(SplitString(SplitedString,',')); //nur Nummern
    PhoneAreaLst.Add(SplitString(SplitedString,' '));   //nur Status
  end;
end;

und die Hilfsfunktion so:

Delphi-Quellcode:
Function SplitString (Var S: String; Del: String): String;
Var
  p: Integer;

Begin
  p := pos(Del, S);
  If p = 0 Then Begin
    Result := s;
    s := '';
  End
  Else Begin
    Result := Copy(s, 1, p - 1);
    SplitedString := Copy(s, p + length(Del), length(s)); //SplitedString : string
  End;
End;
Gruß, bluescreen25

raiguen 4. Apr 2007 20:27

Re: Strings zerlegen in 3 Stringlisten
 
Moin...
Du kannst das noch weiter vereinfachen:
Delphi-Quellcode:
procedure CreatePhone;
var i:integer;
    temp:string;
    tmpList: TStrings;
begin
  phoneFullLst := TStringList.Create;
  phoneNameLst := TStringList.Create;
  phoneNumberLst := TStringList.Create;
  phoneAreaLst := TStringList.Create;
 

  if FileExists(ProgrammPfad + '\tbook.txt') then
    begin
      phoneFullLst.LoadFromFile(ProgrammPfad + '\tbook.txt');
      //--tempöräre Liste erzeugen
      tmpList := TStringList.Create;

      for I:=0 to phoneFullLst.Count-1 do
        begin
          temp := phoneFullLst.strings[i];
          {wenn Delphi 6 und höher:}
            tmpList.Delimiter := ',';
            tmpList.DelimitedText := temp;
          {für alle Delphi-Versionen geht auch das:}
            tmpList.CommaText := temp;
          phoneNameLst.Add(tmpList[0]);   //nur Namen
          phoneNumberLst.Add(tmpList[1]); //nur Nummern
          PhoneAreaLst.Add(tmpList[2]);   //nur Status
      end;
      tmpList.Free;
  end;
end;
Die Funktion .DelimitedText bzw .CommaText erzeugt aus einem (hier) KommaSeparierten String einzelne Strings (in deinem Beispiel 3), auf die Du mittels Index zugreifen kannst ;)

bluescreen25 4. Apr 2007 20:50

Re: Strings zerlegen in 3 Stringlisten
 
Zitat:

Zitat von raiguen
Moin...
Du kannst das noch weiter vereinfachen:
Delphi-Quellcode:
procedure CreatePhone;
var i:integer;
    temp:string;
    tmpList: TStrings;
begin
  phoneFullLst := TStringList.Create;
  phoneNameLst := TStringList.Create;
  phoneNumberLst := TStringList.Create;
  phoneAreaLst := TStringList.Create;
 

  if FileExists(ProgrammPfad + '\tbook.txt') then
    begin
      phoneFullLst.LoadFromFile(ProgrammPfad + '\tbook.txt');
      //--tempöräre Liste erzeugen
      tmpList := TStringList.Create;

      for I:=0 to phoneFullLst.Count-1 do
        begin
          temp := phoneFullLst.strings[i];
          {wenn Delphi 6 und höher:}
            tmpList.Delimiter := ',';
            tmpList.DelimitedText := temp;
          {für alle Delphi-Versionen geht auch das:}
            tmpList.CommaText := temp;
          phoneNameLst.Add(tmpList[0]);   //nur Namen
          phoneNumberLst.Add(tmpList[1]); //nur Nummern
          PhoneAreaLst.Add(tmpList[2]);   //nur Status
      end;
      tmpList.Free;
  end;
end;
Die Funktion .DelimitedText bzw .CommaText erzeugt aus einem (hier) KommaSeparierten String einzelne Strings (in deinem Beispiel 3), auf die Du mittels Index zugreifen kannst ;)



Also die TXT-datei mal so gefüllt:

Hans Müller,02838778876,Home
Frank Zander,054632882622,Work
Frauke Musterfrau,08826255522,Mobil

ergab nicht das richtige Ergebnis.

Inhalt von phoneNameLst:
Hans
Frank
Frauke

Inhalt von phoneNumberLst:
Müller
Zander
Musterfrau

Inhalt von phoneAreaLst:
02838778876
054632882622
08826255522


Gruß bluescreen25

Jelly 4. Apr 2007 20:53

Re: Strings zerlegen in 3 Stringlisten
 
Bist Du sicher, dass TStringList das ist, was Du brauchst ?

Ich geh mal davon aus, du willst die Adressdaten irgendwie laden um dann damit zu arbeiten. Da sind TStringList sicherlich nicht die erste Wahl. Wenn morgen eine Spalte dazu kommt, erstellst Du dann eine neue StringList? Du speicherst zusammenhängende Daten (Adressen) in 3 unterschiedlichen Objekten. Das nenn ich ungeschickt.

Meine erste Wahl, wäre das Anlegen einer Klasse, die als Attribute Name, Nummer und Status hat. Nenn die Klasse TKontakt.

Delphi-Quellcode:
TKontakt = class
public
    Name, Nummer, Status : string ;
end ;
Weil es mehrere Kontakte geben wird, kannst Du diese in einer Liste verwalten. Am schnellsten ist dafür die TObjectList geeignet. Ellegant gehts auch mit TCollection.

Dieser Liste kannst Du dann beliebige Objekte zuordnen, also auch vom Typ TKontakt. Etwa so:

Delphi-Quellcode:
var
  Kontakte : TObjectList ;

procedure Add ;
var
  Kontakt : TKontakt ;
begin
     Kontakt := TKontakt.Create ;
     // Jetzt Kontakt füllen
     Kontakt.Name := '' ;  // aus deiner Textfile lesen
     Kontakt.Nummer := '' ;
     Kontakt.Status := '' ;
     Kontakte.Add (Kontakt) ;
end ;
Damit hast Du, sofern du das Beispiel noch etwas ausarbeitest, eine schöne sauber Datenstruktur, mit der du machen kannst was dir beliebt.

bluescreen25 4. Apr 2007 21:01

Re: Strings zerlegen in 3 Stringlisten
 
Zitat:

Zitat von Jelly
Bist Du sicher, dass TStringList das ist, was Du brauchst ?

Ich geh mal davon aus, du willst die Adressdaten irgendwie laden um dann damit zu arbeiten. Da sind TStringList sicherlich nicht die erste Wahl. Wenn morgen eine Spalte dazu kommt, erstellst Du dann eine neue StringList? Du speicherst zusammenhängende Daten (Adressen) in 3 unterschiedlichen Objekten. Das nenn ich ungeschickt.

Meine erste Wahl, wäre das Anlegen einer Klasse, die als Attribute Name, Nummer und Status hat. Nenn die Klasse TKontakt.

Delphi-Quellcode:
TKontakt = class
public
    Name, Nummer, Status : string ;
end ;
Weil es mehrere Kontakte geben wird, kannst Du diese in einer Liste verwalten. Am schnellsten ist dafür die TObjectList geeignet. Ellegant gehts auch mit TCollection.

Dieser Liste kannst Du dann beliebige Objekte zuordnen, also auch vom Typ TKontakt. Etwa so:

Delphi-Quellcode:
var
  Kontakte : TObjectList ;

procedure Add ;
var
  Kontakt : TKontakt ;
begin
     Kontakt := TKontakt.Create ;
     // Jetzt Kontakt füllen
     Kontakt.Name := '' ;  // aus deiner Textfile lesen
     Kontakt.Nummer := '' ;
     Kontakt.Status := '' ;
     Kontakte.Add (Kontakt) ;
end ;
Damit hast Du, sofern du das Beispiel noch etwas ausarbeitest, eine schöne sauber Datenstruktur, mit der du machen kannst was dir beliebt.

Das scheint mir ein interessanter Ansatz.
Ich nutze ein Listview zur Darstellung der Namen incl. Icon, welches durch Area deffiniert wird.
Wird im Listview ein Item geklickt, wird die dazugehörige Nummer in einem Label angezeigt und via Bluetooth dem Handy übermittelt....


Das Problem ist noch nicht die Weiterverarbeitung der Daten, es sind in meiner Anwendung nicht allzu viele, aber halt das fehlerfreie Einlesen aus der Txt-Datei bzw auch füllen der Txt-Datei aus den Daten.

Gruß, bluescreen25

Jelly 4. Apr 2007 21:09

Re: Strings zerlegen in 3 Stringlisten
 
Listviews können ja auch mehrere Spalten verwalten. Aber leider nur im Textformat. Bei dir ist das vielleicht ok weil du nur Textinformationen hast. In der Regel ist der Ansatz jedoch unpraktisch. Was, wenn plötzlich Integers, Datum und Zeit zu deinem Datenpaket gehören.

Ich verwalte solche Sachen eben meist in einer TObjectList. Wie ich dann die Daten darstelle, ist sekundär: Listview, Treeview, oder was auch immer mir am geeignedsden erscheint.

Neben der Typensicherheit bietet das auch noch andere Vorteile. Du hast eben alles schön sauber in geordneten Klassen. Und vorallem: eine saubere Trennung zwischen Datenpool und dessen Darstellung.

Und wenn du published properties zur Wertspeicherung wählst, und deine Datenklasse von TPersistent ableitest, so kannst Du auch noch auf andere Wege auf deine Properties zugreifen als über kontakt.Status (Stichwort typinfo). Dadurch kannst du dir eine allgemein gültige Struktur schaffen, die du relativ leicht und dynamisch laden und speichern kannst. Unter .NET heisst das "Serialisieren von Klassen", ist aber so auch über Delphi realisierbar (zumindest ansatzweise).

Aber das nur am Rande. Wichtig ist das fett Geschriebene. Anfangs vielleicht etwas mehr Aufwand, aber es wird sich lohnen wenn du mehrere Datenstrukturen zu verwalten hast. Für so Dinge sind Listviews nicht geeignet.

bluescreen25 4. Apr 2007 21:21

Re: Strings zerlegen in 3 Stringlisten
 
Zitat:

Zitat von Jelly
Listviews können ja auch mehrere Spalten verwalten. Aber leider nur im Textformat. Bei dir ist das vielleicht ok weil du nur Textinformationen hast. In der Regel ist der Ansatz jedoch unpraktisch. Was, wenn plötzlich Integers, Datum und Zeit zu deinem Datenpaket gehören.

Ich verwalte solche Sachen eben meist in einer TObjectList. Wie ich dann die Daten darstelle, ist sekundär: Listview, Treeview, oder was auch immer mir am geeignedsden erscheint.

Neben der Typensicherheit bietet das auch noch andere Vorteile. Du hast eben alles schön sauber in geordneten Klassen. Und vorallem: eine saubere Trennung zwischen Datenpool und dessen Darstellung.

Und wenn du published properties zur Wertspeicherung wählst, und deine Datenklasse von TPersistent ableitest, so kannst Du auch noch auf andere Wege auf deine Properties zugreifen als über kontakt.Status (Stichwort typinfo). Dadurch kannst du dir eine allgemein gültige Struktur schaffen, die du relativ leicht und dynamisch laden und speichern kannst. Unter .NET heisst das "Serialisieren von Klassen", ist aber so auch über Delphi realisierbar (zumindest ansatzweise).

Aber das nur am Rande. Wichtig ist das fett Geschriebene. Anfangs vielleicht etwas mehr Aufwand, aber es wird sich lohnen wenn du mehrere Datenstrukturen zu verwalten hast. Für so Dinge sind Listviews nicht geeignet.

Im Grunde ist die Txt-Datei bei mir nur durch die MindestDaten deffiniert. Diese 3 Daten sind die, die ich benutze und irgendwie in eine Datei speichern und auslesen muß. Wie die Datei aussieht, ist eigendlich noch offen, habe es mal durch Komma getrennt pro Zeile als Bsp angegeben. Allein das macht ja schon ein paar Probleme, diese dann sauber auszulesen. Ganz zu schweige, wenn mal ein Teil der Daten innerhalb einer Zeile nicht vorhanden ist.....
Vielen Dank für die Ausführungen.

Gruß, bluescreen25


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 Uhr.
Seite 1 von 2  1 2      

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