首页 > 解决方案 > 将 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

我希望每一行都存储在(vector<vector<string>>)没有逗号的二维向量中。

我试过做:

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

但这似乎不起作用。我能做些什么?

标签: c++csvfilemultidimensional-array2d-vector

解决方案


恕我直言,您不想使用二维向量或数组。你想要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);
}

通常,根据输入记录对结构进行建模会产生更好的程序。更容易开发和调试。

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


推荐阅读