![]() |
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 |
Re: Strings zerlegen in 3 Stringlisten
Delphi-Quellcode:
[edit] Ach nein, Du willst ja alle Namen in einer Liste haben.... Das würde mit einer Hilfsfunktion gehen. Ich habe so gelöst:
Var s : TStringList;
Begin s := TStringlist.Create; s.Delimiter := ','; s.DelimitedText := 'a,b,c'; ...
Delphi-Quellcode:
Die Funktion schnippelt vom String 'S' alle Zeichen bis zum ersten Auftreten des Trennstrings 'Del' weg und liefert diesen Teilstring.
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;
Delphi-Quellcode:
In X ist nun 'abc' und in s dann 'def'. Das sollte dir reichen.
S :='abc,def';
X := Split (s,','); |
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 // ---------------------------------- |
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:
Gruß, bluescreen25
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; |
Re: Strings zerlegen in 3 Stringlisten
Moin...
Du kannst das noch weiter vereinfachen:
Delphi-Quellcode:
Die Funktion .DelimitedText bzw .CommaText erzeugt aus einem (hier) KommaSeparierten String einzelne Strings (in deinem Beispiel 3), auf die Du mittels Index zugreifen kannst ;)
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; |
Re: Strings zerlegen in 3 Stringlisten
Zitat:
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 |
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:
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.
TKontakt = class
public Name, Nummer, Status : string ; end ; Dieser Liste kannst Du dann beliebige Objekte zuordnen, also auch vom Typ TKontakt. Etwa so:
Delphi-Quellcode:
Damit hast Du, sofern du das Beispiel noch etwas ausarbeitest, eine schöne sauber Datenstruktur, mit der du machen kannst was dir beliebt.
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 ; |
Re: Strings zerlegen in 3 Stringlisten
Zitat:
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 |
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. |
Re: Strings zerlegen in 3 Stringlisten
Zitat:
Vielen Dank für die Ausführungen. Gruß, bluescreen25 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 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