2013-07-29 73 views
0

當前,在C++中解析字符串

我有這個字符串us,muscoy,Muscoy,CA,,34.1541667,-117.3433333

我需要解析US和CA.我能夠正確地解析美國:

std::string line; 
std::ifstream myfile ("/Users/settingj/Documents/Country-State Parse/worldcitiespop.txt");  
while(std::getline(myfile, line)) 
{ 

    while (myfile.good()) 
    { 
     getline (myfile,line); 
     //std::cout << line << std::endl; 

     std::cout << "Country:"; 
     for (int i = 0; i < 2/*line.length()*/; i++) 
     { 
      std::cout << line[i]; 
     } 
    } 

} 

但我有問題解析到CA.

繼承人一些代碼,我挖出來找到字符串中的量「」出現,但我有問題,說:「解析第三和第四‘’發生之間的字符串。

// Counts the number of ',' occurrences 
size_t n = std::count(line.begin(), line.end(), ','); 
std::cout << n << std::endl; 
+0

如果這是類,你可以忽略這個,但你可能應該使用boost :: split來分隔csv – IdeaHat

回答

1

這不是一類...哈哈...這似乎是一類的問題,但...

我有解決方案:

 int count = 0; 
     for (int i = 0; i < line.length(); i++) 
     { 
      if (line[i] == ',') 
       count++; 
      if (count == 3){ 
       std::cout << line[i+1]; 
       if (line[i+1] == ',') 
        break; 
      } 
     } 

就不得不考慮一下更多:P

2

你可以使用boost::split功能(或boost::tokenizer)用於這一目的。這將字符串分割成vector<string>

std::string line; 
std::vector<std::string> results; 
boost::split(results, line, boost::is_any_of(",")); 
std::string state = results[3]; 
+0

的列哦,....我會試試這個.. – jsetting32

+0

我實際上遇到了將boost庫導入到我的項目中的問題......我使用xcode作爲我的IDE – jsetting32

1

這是STL版本,非常有效簡單的逗號分隔的輸入文件。

#include<fstream> 
#include <string> 
#include <iostream> 
#include<vector> 
#include<sstream> 

std::vector<std::string> getValues(std::istream& str) 
{ 
    std::vector<std::string> result; 
    std::string line; 
    std::getline(str,line); 

    std::stringstream lineS(line); 
    std::string cell; 

    while(std::getline(lineS,cell,',')) 
     result.push_back(cell); 

    return result; 
} 


int main() 
{ 
    std::ifstream f("input.txt"); 
    std::string s; 

    //Create a vector or vector of strings for rows and columns 

    std::vector< std::vector<std::string> > v; 

    while(!f.eof()) 
     v.push_back(getValues(f)); 

    for (auto i:v) 
    { 
     for(auto j:i) 
     std::cout<<j<< " "; 
     std::cout<<std::endl; 
    } 
}