Wie verwenden von boost-split-aufteilen einer Zeichenfolge und leere Werte ignorieren?
Ich bin mit boost::split zum analysieren einer Daten-Datei. Die Daten-Datei enthält Zeilen wie die folgenden.
data.txt
1:1~15 ASTKGPSVFPLAPSS SVFPLAPSS -12.6 98.3
Den Leerraum zwischen den Elementen sind tabs. Den code habe ich zu teilen Sie die obige Zeile wie folgt.
std::string buf;
/*Assign the line from the file to buf*/
std::vector<std::string> dataLine;
boost::split( dataLine, buf , boost::is_any_of("\t "), boost::token_compress_on); //Split data line
cout << dataLine.size() << endl;
Für die obige Codezeile sollte ich einen Druck von 5, aber ich bekomme 6. Ich habe versucht zu Lesen durch die Dokumentation, und diese Lösung scheint so, als ob Sie sollte das tun, was ich will, klar ich bin etwas fehlt. Danke!
Bearbeiten:
Läuft ein forloop wie folgt auf dataLine Sie bekommen die folgenden.
cout << "****" << endl;
for(int i = 0 ; i < dataLine.size() ; i ++) cout << dataLine[i] << endl;
cout << "****" << endl;
****
1:1~15
ASTKGPSVFPLAPSS
SVFPLAPSS
-12.6
98.3
****
InformationsquelleAutor der Frage PhiloEpisteme | 2013-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl "benachbarten Separatoren werden zusammengeführt", es scheint, wie die nachfolgende delimeters das problem, da selbst wenn Sie behandelt werden, wie man ist, es immer noch ist einen delimeter.
So dass Ihr problem nicht gelöst werden kann mit
split()
allein. Aber zum Glück Boost-String-Algo hattrim()
undtrim_if()
die strip whitespace oder delimeters von Anfang und Ende einer Zeichenfolge. Also einfach anrufentrim()
auf buf, wie diese:Diese Frage wurde schon gestellt: boost::split Blätter leer Token am Anfang und Ende von string - ist das gewünschte Verhalten?
InformationsquelleAutor der Antwort Oberon
Ich würde empfehlen, mit C++ String-Toolkit-Bibliothek. Diese Bibliothek ist viel schneller als die Boost meiner Meinung nach. Ich verwendet, um Boost split (aka tokenisierung) eine Textzeile gefunden, aber diese Bibliothek ist viel mehr in Linie mit dem, was ich will.
Einer der großen Dinge über
strtk::parse
ist die Umwandlung von tokens in Ihre endgültige Wert und die überprüfung der Anzahl der Elemente.könnten Sie es so:
--- andere version
Online-Dokumentation für die Bibliothek: String Tokenizer Dokumentation
Link zum Quellcode: C++ String-Toolkit-Bibliothek
InformationsquelleAutor der Antwort DannyK
Führende und nachfolgende Leerzeichen absichtlich allein gelassen von
boost::split
weil Sie nicht wissen, ob es bedeutend ist oder nicht. Die Lösung ist die Verwendungboost::trim
vor dem Aufrufboost::split
.InformationsquelleAutor der Antwort Jesse Good