2015-12-02 29 views
0

我想使用C++將csv文件解析爲2D地圖。 CSV文件看起來是這樣的:解析數據到C++ 2D地圖

xxx,1,2 
xxx,3,4 
xxx,5,6 
yyy,7,8 
yyy,9,10 
zzz,11,12 
zzz,13,14 
zzz,15,16 

從C#背景的,我可以使用的代碼,只需幾行用C#這樣做很容易

 Dictionary<string, Dictionary<double, int>> mainMap = new Dictionary<string, Dictionary<double, int>>(); 

     string[] lines = File.ReadAllLines(@"C:\Users\xxx\Desktop\myFile.csv"); 

     foreach(string line in lines) 
     { 
      string[] v = line.Split(','); 

      if (!mainMap.ContainsKey(v[0])) 
       mainMap[v[0]] = new Dictionary<double, int>(); 

      mainMap[v[0]][Convert.ToDouble(v[1])] = Convert.ToInt32(v[2]); 
     } 

我怎樣才能做到同樣的事情在C++只使用標準(std)庫?

回答

1
#include <string> 
#include <vector> 
#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <utility> 
#include <map> 

typedef std::map<double, int> DoubleIntMap; 
typedef std::map<std::string, DoubleIntMap> MyMap; 

int main() 
{ 
    MyMap mainMap; 

    std::ifstream in("C:/Users/xxx/Desktop/myFile.csv"); // Use forward slashes on Windows too 
    if(in.good()) { 
     std::string line; 
     while(std::getline(in, line)) { 
      std::string item; 
      std::vector<std::string> parts; 
      std::stringstream ss(line); 
      while(std::getline(ss, item, ',')) { 
       parts.push_back(item); 
      } 
      if(parts.size() == 3){ 
       std::string key = parts[0]; 
       double d = std::stod(parts[1]); 
       int i = std::stoi(parts[2]); 
       mainMap[key][d] = i; 
      } 
     } 
     // Extra: print them out 
     // You can use auto in C++11 instead of MyMap::const_iterator but I prefer the proper type :) 
     for(MyMap::const_iterator iter = mainMap.begin(); iter != mainMap.end(); ++iter) { 
      const DoubleIntMap& item = iter->second; 
      for(DoubleIntMap::const_iterator inner_iter = item.begin(); inner_iter != item.end(); ++inner_iter) { 
       std::cout << iter->first << " (" << inner_iter->first << ", " << inner_iter->second << ")\n"; 
      } 
     } 
    } 
    return 0; 
} 
+0

非常感謝!另外感謝您添加額外的代碼以向我展示如何將它們打印出來!我需要它,真的很感激它:) – interceptwind

1

一個可以進行如下(假設標準輸入):

#include <iostream> 
#include <sstream> 
#include <string> 
#include <map> 

int main(){ 

    std::string line, token; 
    std::stringstream iss; 
    std::map<std::string, std::map<double, int>> mainMap; 

    std::string key1; 
    double key2; 
    int val; 

    while(std::getline(std::cin, line)){ 
     iss.clear(); 
     iss.str(line); 

     size_t token_id(0); 

     while(std::getline(iss, token, ',')){ 
      if(token_id == 0){ 
       key1 = token; 

      }else if(token_id == 1){ 
       key2 = std::stod(token); 

      }else if(token_id == 2){ 
       val = std::stoi(token); 
      } 
      token_id++; 
     } 
     mainMap[key1][key2] = val; 
    } 

    return 0; 
} 

當然,應該增加一些檢查輸入的有效性...

+0

非常感謝您!真的很感激:) – interceptwind