如何将csv文件数据读入数组?

时间:2015-12-11 07:17:22

标签: c++

我的CSV文件格式如下:

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

如何将其转换为2D数组,以便我可以进行一些计算?

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
        }
    }
};

3 个答案:

答案 0 :(得分: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);
    }
};

答案 1 :(得分:0)

以下代码正常运行。希望它可以帮到你。它有一个类似于istream_iterator的CSV文件类。它是一个模板,因此它可以读取字符串,整数,双精度等。它的构造函数接受一个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;
    }

答案 2 :(得分: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) ;
  }
};