string der durch ; getrennt ist trennen



  • ich habe einen string der durch das zeichen ; getrennt ist. Wie kann ich diesen String trennen.
    Beipielstring;
    Karl;Mueller;Hauptstr.22;Stuttgart

    So das ich zum Beipiel mit Hilfe eines arrays sagen kann:
    cout<<zeile[3]
    und er mir somit Stuttgart ausgibt.



  • Sowas ist mit TStringList möglich, z.B. mit Delimiter und DelimitedText.
    Wenn Du allerdings eine große Datei mit vielen derartigen Einträgen hast,
    dürfte der Einsatz einer TStringList nicht optimal sein.

    Gruß,

    Alexander



  • Hast du ein Beispiel dafür oder kann mir jemand eins machen, komm mit der Hilfe nicht zurecht



  • Hatte das mal so gelöst. da ich mich mit TStringList auch noch nicht auseinandergesetzt habe... 🙄

    String Seperator(String &source,char del,int pos)
    {
       int x=0,oldpos=1;
       while(x++<=source.Length())
       {
          if(source[x]==del)
          {
             if(--pos) oldpos=x+1;
             else break;
          }
       }
       return source.SubString(oldpos,x-oldpos);
    }
    

    Geht bestimmt noch schöner .... :p

    Aufruf der Funktion wie folgt:

    String gesamtstring="1111;2222;3333;";
    String teilstring = Seperator(gesamtstring,';',2);
    

    In teilstring hast du dann 2222 stehen ...



  • Für std::string hab ich folgendes

    string Seperator(string &source,char del,int pos)
    {
       int x=-1;
       while(pos--) x=1+source.find(del,x);
       return source.substr(x,source.find(del,x)-x);
    }
    


  • Hallo,
    hier noch eine andere Variante, müsstest die Semikolons nur durch Leerzeichen wechseln:

    string str = "Ich esse am liebsten Eis";
    vector<string> m_v;
    copy(istream_iterator<string>(istringstream(str)), istream_iterator<string>(), back_inserter(m_v));
    

    In m_v hast du dann alle Einzelworte liegen.



  • Der Vollständigkeit halber noch ein (ungetestetes) Beispiel mit TStringList:

    TStringList* sl = new TStringList();
    sl->Delimiter = ';';
    sl->DelimitedText = "Karl;Mueller;Hauptstr.22;Stuttgart";
    // Über die Eigenschaft Strings[int Index] lassen sich jetzt die einzelnen
    // Teilstrings ansprechen
    AnsiString str = sl->Strings[3];
    // str enthält jetzt "Stuttgart"
    

    Falls die Teilstrings in Anführungszeichen stehen, lässt sich auch noch ein
    Zeichen dafür einstellen. Wenn ich mich recht erinnere, ist die Eigenschaft
    QuoteChar.

    Gruß,

    Alexander



  • Ich mach das immer so:

    AnsiString str = "Dies;ist;ein;String;1;2";
    String Symbol  = ";";
    INT Anzahl     = 0;
    INT n          = 0;
    INT Length     = str.Length();
    AnsiString Teil[999];
    AnsiString Zeichen[999];
    AnsiString Voll = str;
    
    for (n=0; n<Length; n++)
    {
      Zeichen[n] = LeftStr (str,1);
      if (Zeichen[n] == Symbol)
        Anzahl ++;
      str = str.SubString(2,str.Length());
    }
    for (n=0; n<Anzahl; n++)
    {
      Teil[n] = LeftStr (Voll,AnsiPos(Symbol,Voll)-1);
      Voll = Voll.SubString(AnsiPos(Symbol,Voll)+1,Voll.Length());
    }
    Teil[Anzahl] = Voll;
    
    // Teil[0] = "Dies"      Teil[1] = "ist"     Teil[2] = "ein"
    // Teil[3] = "String"    Teil[4] = "1"       Teil[5] = "2"
    

    Ich bin nur mit diesen großen Arrays nicht zufrieden:
    AnsiString Teil[999];
    AnsiString Zeichen[999];

    Hat da wer einen Vorschlag zur Verbesserung?



  • Blackshadow schrieb:

    Hat da wer einen Vorschlag zur Verbesserung?

    Klar: vergiss das alles und benutze statt dessen TStringList (siehe A.Kempf).

    Die Länge des Ursprungs-Strings ist das Höchstmass, d.h. die Arrays werden mit Sicherheit nie mehr Elemente enthalten als der String Zeichen hat. Damit hast du zumindest einen Anhaltspunkt zur Dimensionierung der Arrays. Nur dumm, dass sich diese dynamische Dimensionierung nicht mehr so einfach erledigen lässt, dein Ansatz wird also noch umständlicher.


Anmelden zum Antworten