将CSV文件读入2D向量

问题描述

我的文件内容如下:

Barr,3145,7
Rab,12,5513,1412,221,232,179,7121231
Bean,1,1231,219,21,337,9239,312,764,640391,4,7966346,22278,5,116364,56350
Earl,132,230,121,32,425,67
Donut,112,5525,23121,2123,65432,8790,3,4567,444

我希望每行都存储在2D向量(vector<vector<string>>)中,且不带逗号。

我尝试做:

while(getline(filestream,line)){   
    stringstream linestream(line);
    while(getline(linestream,anotherLine,','){
        oneDvector.push_back(anotherLine);  
    }
    twoDvector.push_back(oneDvector);
    oneDvector.clear();
}

但这似乎不起作用。我该怎么办?

解决方法

恕我直言,您不想使用2D向量或数组。您需要一个std::vector的课程:

struct Record
{
    std::string    text;
    std::vector<int> data;

    friend std::istream& operator>>(std::istream& input,Record& r);
};

std::istream& operator>>(std::istream& input,Record& r)
{
    std::string  text_line;
    std::getline(input,text_line);
    std::istringstream text_stream(text_line);
    std::getline(text_stream,r.text,',');
    int value;
    char comma;
    while (text_stream >> value)
    {
        r.data.push_back(value);
        text_stream >> comma;
    }
    return input;
}

注意:在上面的输入函数中,一条记录逐行读入一个字符串。这将使数字的读取更加容易。

您输入的循环看起来像:

Record r;
std::vector<Record> database;
while (file_stream >> r)
{
    database.push_back(r);
}

通常根据输入记录对结构进行建模可以使程序更好。易于开发和调试。

可以通过用空格替换第二个出现的和剩余的逗号来简化输入。第一个逗号用于结束文本字段。