String bis zu einem bestimmten Zeichen einlesen - Wie?



  • Hallo Zusammen,
    ich lese eine Textdatei Zeile für Zeile ein. In jeder Zeile sind Daten wo die Felder mit einem Semikolon getrennt sind. Ich möchte jetzt die Daten immer von einem Semikolon bis zum nächsten einlesen. Als Beispiel mal der Aufbau

    Vorname;Name;Strasse;PLZ;ORT
    Max;Mustermann;Musterstraße 12;12345;Musterstadt

    Gibt es jetzt eine Möglichkeit Schritt für Schritt die Daten immer bis zum nächsten Semikolon einzulesen?

    Meine Idee wäre jetzt gewesen, die Daten Zeichen für Zeichen einzulesen und dann immer zu schauen, ob es sich dabei um ein Semikolon handelt oder nicht. Geht das auch einfacher?



  • Möglichkeiten gibt es mehrere
    1. den Inhalt einer Zeile an eine StringList übergeben und das Semikolon als Delimiter angeben (DelimitedText) und dann einfach die StringList abarbeiten (Hinweis: auf die Verwendung von StrictDelimiter achten; bei BCB-Versionen ohne StrictDelimiter wird auch das Leerzeichen als Trennzeichen verwendet)
    2. mit a) Pos das nächste Semikolon suchen, b) den Text davor auslesen (SubString) und c) dann denn gelesenen Text einschließlich Semikolon löschen (Delete) und wieder bei a) beginnen
    3. Alternative zu 1. (wenn kein StrictDelimiter möglich): mit StringReplace alle Semikolon durch Zeilenumbrüche ersetzen und einer StringList zuweisen (StringList1->Text), dann die StringList abarbeiten



  • Danke schön für die Tipps. Werde sie mir mal anschauen.



  • char separator[] = ";";
    char *token;
    token = strtok(path, separator);
    while(token != NULL)
    {
    	if(strtok(NULL,separator) == NULL)
    		break;
    	token = strtok(NULL, separator);
    }
    

    token enthält jeden Teilstring. Kannste dir dann in der While-Schleife abgreifen.

    greetz KN4CK3R



  • String separator(String &source,char delemiter,unsigned pos)
    {
       unsigned x=1;
       while(--pos) x+=source.SubString(x,source.Length()-x).Pos(delemiter);
       return source.SubString(x,source.SubString(x,source.Length()-x+1).Pos(delemiter)-1);
    }
    
    String source="Max;Mustermann;Musterstraße 12;12345;Musterstadt;";
    Edit1->Text = seperator(source,';',1);
    

    Aber normalerweise bietet TStringList schon das passende und ist darum auch zu bevorzugen.


Anmelden zum Antworten