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
stattstoi
?
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.