String unbekannter Länge in Integer splitten



  • Guten Abend!
    Wie schaut denn eine moderne Methode aus, einen Text-String mit zuvor unbekannter Länge (aus einer Datenbank gelesen) zu zerteilen?

    Dieser Text enthält ausschließlich Komma-separierte Integer. (Beispiel-String: "1,2,2,2,3,3") Vielleicht was mit

    substr
    

    und dann vielleicht

    std::to_int
    

    ?



  • Was ist eine "moderne Methode" für dich?

    Was bedeutet das für dich:

    • "moderne" Features zu nutzen (ranges etc)
    • besonders lesbar zu sein
    • besonders effizient zu sein
    • from_chars statt stoi?

    Generell kann man am Anfang mal die Kommas zählen, um einen Ergebnis-int-vector vorzubereiten (oder hast du irgendwas, wo das Ergebnis hingeschrieben werden soll)



  • @thuering Eine althergebrachte Methode wäre die Kommas zu suchen und was dazwiscxhen ist rauszukopieren oder von mir aus einen view darauf zu verwenden. Oder einfach boost::split.



  • Das ist doch einfacher mittels der üblichen Stream-Methoden:

    std::string text =  "1,2,2,2,3,3";
    std::istringstream istr(text);
    int value;
    char c;
    while (istr >> value)
    {
      std::cout << value << '\n'; // oder was auch immer mit dem Wert passieren soll
    
      istr >> /*std::ws >>*/ c; // auskommentieren, um Leerzeichen zu überlesen
      if (c != ',')
        break; // evtl. Exception werfen o.ä.
    }
    


  • Eine "moderne" Lösung wäre vlt:

    #include <string_view>
    #include <ranges>
    #include <iostream>
    #include <charconv>
    
    int main()
    {
        std::string_view  s ="1,2,2,2,3,3";
        
        for(const auto el : std::views::split(s, ',') )
        {
            int num;
            std::from_chars(el.data(), el.data() + el.size(), num);
            std::cout << num << "\n";
        }
    }
    


  • @Schlangenmensch das schaut doch modern, elegant und übersichtlich aus! Vielen Dank!



  • @thuering
    Ich habe da iwie ein seltsames Gefühl, wenn ich Datenbanken und kommaseparierte Daten lese (zusammengereimt aus zwei Threads von dir). Ist das Inhalt eine db-Spalte?



  • @DocShoe ja, das ist tatsächlich aus einer Textspalte. Ich wollte hier unbedingt mehrere Nummern in einem Datensatz unterbringen. Deshalb ist das so designed.



  • @thuering sagte in String unbekannter Länge in Integer splitten:

    Deshalb ist das so designed.

    Viele Datenbanken können json-Spalten (z.B. Postgres). Damit könntest du dann einfach [1,2,2,3,4] in die Tabellenspalte reinschreiben und dann schon datenbankseitig z.B. auf die Länge selecten.


Log in to reply