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