2015-12-11 57 views
1

我格式化爲以下CSV文件:如何將csv文件數據讀入數組?

1,50,a,46,50,b 
2, 20,s,56,30,f 
3,35,b,5,67,s 
... 

我如何可以反過來說,一個二維數組,這樣我可以做一些計算?

void Core::parseCSV(){ 
    std::ifstream data("test.csv"); 
    std::string line; 
    while(std::getline(data,line)) 
    { 
     std::stringstream lineStream(line); 
     std::string cell; 
     while(std::getline(lineStream,cell,',')) 
     { 
      //not sure how to create the 2d array here 
     } 
    } 
}; 
+0

你可以看看類似問題的現有答案 - 例如, [這裏](http://stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c)?從那些,你嘗試了什麼,你遇到了什麼麻煩? –

+0

@TonyD,我編輯了這個問題。 – user2584325

+0

你認爲像'a'和'b'這樣的值會發生什麼?是否有一些硬編碼映射到數值,你可以使用它進行計算?還是應該忽略它們?你是否必須記住他們爲他們的價值「解決」一些矩陣系統?如果你最初不想處理這些問題,你可以簡單地將值讀入一個'std :: vector >值;',在第一個'while'循環之前放置:在這個循環中,'push_back'是一個空的'vector '或values.resize(values.size()+ 1);'如果你願意的話,然後推回裏面的單元格值。 –

回答

1

試試這個,

void Core::parseCSV() 
{ 
    std::ifstream data("test.csv"); 
    std::string line; 
    std::vector<std::vector<std::string> > parsedCsv; 
    while(std::getline(data,line)) 
    { 
     std::stringstream lineStream(line); 
     std::string cell; 
     std::vector<std::string> parsedRow; 
     while(std::getline(lineStream,cell,',')) 
     { 
      parsedRow.push_back(cell); 
     } 

     parsedCsv.push_back(parsedRow); 
    } 
}; 
0

下面的代碼是工作。希望它能幫助你。它有一個類似於CSV文件的istream_iterator類。它是一個模板,以便它可以讀取字符串,整數,雙精度等。它的構造函數接受一個char分隔符,以便它可以用於超過嚴格以逗號分隔的文件。它也有專門的字符串,可以保留空白字符。

#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <iterator> 

using namespace std; 

template <class T> 
class csv_istream_iterator: public iterator<input_iterator_tag, T> 
{ 
    istream * _input; 
    char _delim; 
    string _value; 
public: 
    csv_istream_iterator(char delim = ','): _input(0), _delim(delim) {} 
    csv_istream_iterator(istream & in, char delim = ','): _input(&in), _delim(delim) { ++*this; } 

    const T operator *() const { 
     istringstream ss(_value); 
     T value; 
     ss >> value; 
     return value; 
    } 

    istream & operator ++() { 
     if(!(getline(*_input, _value, _delim))) 
     { 
      _input = 0; 
     } 
     return *_input; 
    } 

    bool operator !=(const csv_istream_iterator & rhs) const { 
     return _input != rhs._input; 
    } 
}; 

    template <> 
    const string csv_istream_iterator<string>::operator *() const { 
     return _value; 
    } 

    int main(int argc, char * args[]) 
    { 
     { // test for integers 
      ifstream fin("data.csv"); 
      if(fin) 
      { 
       copy(csv_istream_iterator<int>(fin), 
         csv_istream_iterator<int>(), 
         ostream_iterator<int>(cout, " ")); 

       fin.close(); 
      } 
     } 

     cout << endl << "----" << endl; 

     { // test for strings 
      ifstream fin("data.csv"); 
      if(fin) 
      { 
       copy(csv_istream_iterator<string>(fin), 
         csv_istream_iterator<string>(), 
         ostream_iterator<string>(cout, "|")); 

       fin.close(); 
      } 
     } 

     return 0; 
    } 
0

我會去像這樣(未經測試,不完整),並最終細化操作>>,如果你有一個字符串,而不是字符,或漂浮而不是整數。

struct data_t 
{ 
    int a ; 
    int b ; 
    char c ; 
    int d ; 
    int e ; 
    char f ; 
} ; 

std::istream &operator>>(std::istream &ist, data_t &data) 
{ 
    char comma ; 
    ist >> data.a >> comma 
     >> data.b >> comma 
     >> data.c >> comma 
     >> data.d >> comma 
     >> data.e >> comma 
     >> data.f 
    ; 
    return ist ; 
} 
void Core::parseCSV(){ 
    std::ifstream data("test.csv"); 
    std::string line; 
    std::vector<data_t> datavect ; 
    while(std::getline(data,line)) 
    { 
    data_t data ; 
    std::stringstream lineStream(line); 
    lineStream >> data ; 
    datavect.push_back(data) ; 
    } 
};