Einen String Bei Tab zerlegen und in Einzelstrings ablegen



  • hi,
    weis nicht wer von euch mit SPS zu tun hat, es gibt .seq
    files in denen die bezeichner, operatoren und kommentare gepeichert sind:

    Bezeichner     Openand        Kommentar
    
    E1.0           Brenner_ein    Ölbrenner in Betrieb
    E1.1           .....          ....
    .....          .....          ....
    M121.3         M121.3         PB110NW4
    

    da ich nun gezwungen bin diese symbolik datei zu aktualisieren und zu
    faul bin alles zu tippen, habe ich eine software geschrieben in der ich
    eingescannte pläne mit den daten automatisch nachtragen kann.

    Das eigentliche problem besteht darin die in den , aus der datei ausgelesenen
    zeilen enthaltenen daten in drei einzelne Strings zu zerlegen... diese daten
    sind durch einen tabulator getrennt... jemand ne idee?

    thx 🤡



  • Ich würd da jetzt spontan zu sagen: Binär einlesen, jede Zeile in einem std::string speichern, in diesem string solange mit find_first_of in dem String nach \t suchen, den Teil bis dahin rauschneiden und in dem resultstring1 speichern (eventuell in einem Zwei-Dimensionalem-Vektor. Erste Dimension für Anzahl der Zeilen, zweite für Anzahl der teil-Strings), bis es kein Tab-Stopp mehr gibt.

    Hoffe das war verständlich 🙂

    Caipi



  • hmm ich werds mal so testen^^ ich realisiere das eigentliche programm im bcb und lade die zeilen in eine listboxum evnt. nacher noch korrekturen (in 2 edit boxen) vor zu nehmen.(hätte also die zeilen sowieso schon in form eines strings vorliegen)

    Gibt es nicht eine möglichkeit DIESE strings auf ähnliche weise zu verarbeiten?

    sry aber das ist mir momentan noch etwas unverständlich... es muss erst 💡 machen! 😉



  • Kleines Beispiel: (Unschön aber es soll ja nur eine Anregung sein, wie ich es meine ;))

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
            string src("Dast ist\tein String\tmit Tab\tstopps"), tmp;
            vector<string> string_parts;
            int tab_pos;
            do
            {
                    tab_pos = src.find_first_of('\t');
                    if(tab_pos != string::npos)
                    {
                            tmp.assign(src, 0, tab_pos);
                            src.erase(0, tab_pos + 1);
                            string_parts.push_back(tmp);
                    }
            } while(tab_pos != string::npos);
    
            for(unsigned int i = 0; i < string_parts.size(); ++i)
                    cout << "vector<string>[i]: _" << string_parts[i] << "_\n";
    
            return 0;
    }
    

    Caipi



  • char string[] ="E1.0\tBrenner_ein\t\x99lbrenner in Betrieb";
    char Bezeichner[256], Openand[256], Kommentar[256];
    sscanf (string,"%s %s %s",Bezeichner,Openand,Kommentar);
    printf ("%s\n%s\n%s\n",Bezeichner,Openand,Kommentar);
    

    Ähm ja ist C, aber vlt. hilft es dir ja trotzdem



  • Mir ist ein kleiner Fehler unterlaufen, da in deiner Datei ja Leerzeichen vorkommen können muss es so sein:

    char string[] ="E1.0\tBrenner_ein\t\x99lbrenner in Betrieb";
    char Bezeichner[256], Openand[256], Kommentar[256];
    sscanf (string,"%[^\t]\t%[^\t]\t%[^\0]",Bezeichner,Openand,Kommentar);
    printf ("%s\n%s\n%s\n",Bezeichner,Openand,Kommentar);
    

    Gruß



  • Joa....... goil.. gena das habsch gesucht... pefekt thx! 😃



  • Oh man. Ich denke mal wieder viel zu kompliziert 🙄
    Du kannst natürlich auch (Wenn's C++ sein soll) pro Zeile dreimal

    getline(in, str, '\t'); // Wenn in ein input-file-stream und str ein std::string
    

    schreiben. 🙂

    Caipi



  • ach mist , joa klar bei getline gabs ja auch nen delimiter thx ist die sauberere lösung...


Anmelden zum Antworten