2013-04-03 63 views
1

我一個簡單的CSV解析器工作返回一個字符串數組。c + +從功能

從我的csv文件,我得到第一排爲一個字符串,比方說:

"117;'Tom';'Sawyer';"; 

我想實現的是打破我的字符串成片PHP的功能,類似的爆炸:

$string = "117;'Tom';'Sawyer';"; 
$row = explode(";", $string); 
echo $row[0]; 

我需要將返回一個字符串數組中的行變量的函數。

我新的C++,所以我不確定如何尋找或使用。

+0

的可能重複的[是否有在PHP的爆炸()函數的C++的等效?](http://stackoverflow.com/questions/12966957/is-there-an-equivalent-in-c-of-phps-爆炸功能) – 2013-04-03 18:48:23

+0

http://stackoverflow.com/questions/236129/splitting-a-string-in-c的潛在重複 – 2013-04-03 18:48:38

回答

0

好像你正在尋找使用一些指定的分隔符,並把它們順序容器分割字符串的函數。

這裏是做一個函數:

#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 

/// Splits the string using provided delimiters and puts the pieces into a container. 
/// The container must provide push_back and clear methods. 
/// @param a The contaner to put the resulting substrings into 
/// @param str The string to operate on 
/// @param delims Characters that are to be treated as delimiters 
/// @param compress_delims If set to true, will treat mutiple sequential delimiters as a single one 
template<class StringType, class ContainerType> 
void split_string(ContainerType& a, const StringType& str, const StringType& delims, bool compress_delims = true) 
{ 
     typename StringType::size_type search_from = 0; // Place to start looking for delimiters 
     typename StringType::size_type next_delim;  // Location of the next delimiter 

     a.clear(); // Wipe out previous contents of the output container (it must be empty if the input string is empty) 

     // Find the first delim after search_from, 
     // add the substring between search_from and delimiter location to container, 
     // update search_from to delimiter location + 1 so that next time we search, 
     // we encounter the next delimiter. Repeat until we find the last delimiter. 
     while((next_delim = str.find_first_of(delims, search_from)) != StringType::npos) { 
       // If we encounter multiple delimiters in a row and compress_delims is true 
       // treat it as a single delim. 
       if(!(compress_delims && next_delim - search_from <= 1)){ 
         StringType token = str.substr(search_from, next_delim - search_from); 
         a.push_back(token); 
       } 
       search_from = next_delim + 1; 
     } 

     // If we found the last delimiter and there are still some chars after it, 
     // just add them to the container. 
     if(search_from < str.length()) 
       a.push_back(str.substr(search_from)); 
} 

int main() 
{ 
     std::vector<std::string> container; 
     std::string str = " hello so long good bye hurray "; 
     split_string(container, str, std::string(" ")); 
     std::copy(container.begin(), container.end(), std::ostream_iterator<std::string>(std::cout, ",")); 
     std::cout << " (" << container.size() << ")" << std::endl; 
     return 0; 
} 

但是,如果有可能在你的項目中使用升壓,我建議你這樣做。使用boost.string_algo library,其中包含split function用於該特定用途(example usage)。