Split string on delimiter in C++
Some suggest using the Boost libraries for this, but there's an answer to this question on StackOverflow by user Evan Teran (albeit not the accepted answer) that I much prefer because it uses the standard libraries.
As posted on StackOverflow:
The first puts the results in a pre-constructed vector, the second returns a new vector.
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}
As noted on the StackOverflow post, it can be used like:
std::vector<std::string> x = split("one:two::three", ':');
This overloads the split function, and the second function requires the first, so you need both. As a secondary example, here is a version that I slightly expanded for readability and used as a member function of a class called TimeSeriesSetDataFileParser:
std::vector<std::string> & TimeSeriesSetDataFileParser::SplitString(const std::string &inputString, char delimiter, std::vector<std::string> &elements) {
std::stringstream sstream(inputString); //Taken from http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c
std::string element;
while (std::getline(sstream, element, delimiter)) {
elements.push_back(element);
}
return elements;
}
std::vector<std::string> TimeSeriesSetDataFileParser::SplitString(const std::string &inputString, char delimiter) {
std::vector<std::string> elements; //Taken from http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c
this->SplitString(inputString, delimiter, elements);
return elements;
}
And I used it to parse a data file to a 2D vector of strings (the member functions Good() and GetLine() are just methods encapsulating the good() and getline() member functions inherited by ifstream).
std::cout << "Parsing input data file" << std::endl;
std::string line;
std::vector<std::vector<std::string> > vvstr_data;
std::vector<std::string> vstr_splitLine;
while (inputTimeSeriesSetDataFile->Good()) {
line = inputTimeSeriesSetDataFile->GetLine();
if(inputTimeSeriesSetDataFile->Good()) {
vstr_splitLine = this->SplitString(line, '\t');
vvstr_data.push_back(vstr_splitLine); //For now we just read it into a 2 dimensional vector of strings.
}
}

Comments
Post a Comment