AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Strings zerlegen in 3 Stringlisten

Ein Thema von bluescreen25 · begonnen am 4. Apr 2007 · letzter Beitrag vom 5. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#1

Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 12:54
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 13:11
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
sharpals

Registriert seit: 22. Feb 2006
28 Beiträge
 
Delphi 4 Client/Server
 
#3

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 13:30
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
// ----------------------------------
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 15:48
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#5

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 20:27
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
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 20:50
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 20:53
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.
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 21:01
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 21:09
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.
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Strings zerlegen in 3 Stringlisten

  Alt 4. Apr 2007, 21:21
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr.
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