CSV sscanf
-
Hallo
Ich habe eine CSV die ungefähr so aussieht:
string;string1;string2;string3;Es kann aber auch sein das sie so aussieht:
string;;string2;string3
Also das ein Feld leer ist.
Nun will ich die CSV auslesen und mit sscanf in die einzelnen Strings aufteilen:swscanf(zeile, L"%[^;];%[^;];%[^;];%[^;]]", string,string1,string2,string3);Das funktioniert aber nur wenn etwas zwischen den Semikolons steht. Wenn nichts dasteht schlägt es fehl. Wenn z.B das 3. Feld leer ist, dann liest er nur bis zum Dritten Feld ein und nicht weiter.
Bitte um Hilfe.
MfG Tim
-
Also ich schätze, da kommst du mit sscanf nicht sehr weit. Das verlässt sich normalerweise darauf, dass die Datei so aufgebaut ist, wie von dir angegeben. Und wenn der Aufbau variiert... Vielleicht kannst du ja schnell einen eigenen, kleinen Parser schreiben.
-
Der Aufbau bleibt ja immer gleich nur es kann sein, dass mal nichts zwischen den Semikolons steht...??!!
-
Ich hab davon keine Ahnung, würde aber versuchen, vor dem Auslesen Ersetzungen zurchzuführen, ala
replace_all(";;", "; ;");Das Leerzecihen sollte doch als korrekter String durchgehen, oder?
-
Keine schlechte Idee. Aber dann würde ja im string dann später ein Leerzeichen stehen und dass will ich nicht.
-
Fatal Error appears schrieb:
Der Aufbau bleibt ja immer gleich nur es kann sein, dass mal nichts zwischen den Semikolons steht...??!!
Das ist schon ein kleiner Unterschied. Mein Tipp: lies eine ganze Zeile ein und pars es mit einer kleinen RegExp

-
Fatal Error appears schrieb:
Keine schlechte Idee. Aber dann würde ja im string dann später ein Leerzeichen stehen und dass will ich nicht.
if(string == " ") string = "";oder so in der Art.
-
Boost.Regex ist dein Freund!
-
Ähm hast du da ein kleines Beispiel.
-
Ich finde da Boost.Regexp bissi mit Kanonen auf Spatzen geschossen...
Eine eigene kleine Funktion, die mit std-c++ eine Zeile deines Programms nach ";" durchsucht, und dann per Referenz angegebenen Strings zuweist ist nicht allzuschwer.
-
KÖTER schrieb:
Ich finde da Boost.Regexp bissi mit Kanonen auf Spatzen geschossen...
Eine eigene kleine Funktion, die mit std-c++ eine Zeile deines Programms nach ";" durchsucht, und dann per Referenz angegebenen Strings zuweist ist nicht allzuschwer.FullACK
-
Wenn schon boost, dann fände ich boost::tokenizer hier besser.
-
gibt es keine einfachere Methode als mit boost?
MfG Tim
-
Fatal Error appears schrieb:
gibt es keine einfachere Methode als mit boost?
MfG Tim
Die wurde schon genannt. Eine eigene, kleine Funktion.
-
KÖTER schrieb:
Ich finde da Boost.Regexp bissi mit Kanonen auf Spatzen geschossen...
Eine eigene kleine Funktion, die mit std-c++ eine Zeile deines Programms nach ";" durchsucht, und dann per Referenz angegebenen Strings zuweist ist nicht allzuschwer.FullACK
Dürfte auch wesentlich schneller laufen, als mit einem RegExp Ausdruck. Da wäre sogar Boost.Xpressive zu langsam im Vergleich.Mit std::getline alles einlesen, danach den
std::stringmit std::string::find und std::string::substr auseinandernehmen.
Beistd::string::findsollte man im übrigen bemerken, dass man ab einer bestimmten Position suchen kann. Sehr hilfreich um das ganze in einer Schleife zu realisieren
Grüssli
-
Ok danke hat geklappt.