将向量拆分为向量的向量

Posted

技术标签:

【中文标题】将向量拆分为向量的向量【英文标题】:Split Vector into Vector of Vectors 【发布时间】:2015-01-15 21:37:23 【问题描述】:

我目前正在处理来自 Yelp 的结果文本文件,其中包含餐馆和一些其他信息。餐厅的每个元素由竖线 (|) 分隔,每个餐厅由新行 (\n) 分隔。 (见下面的例子)。我正在尝试将这条线拆分为向量的向量。较大的向量将保存所有较小的向量,而较小的向量将分别保存其中一家餐馆的信息。我该如何最好地解决这个问题?

这是文件中的几行:

Meka's Lounge|42.74|-73.69|407 River Street+Troy, NY 12180|http ://www.yelp.com/biz/mekas-lounge-troy|Bars|5|2|4|4|3|4|5
Tosca Grille|42.73|-73.69|200 Broadway+Troy, NY 12180|http ://www.yelp.com/biz/tosca-grille-troy|American (New)|1|3|2|4
Happy Lunch|42.75|-73.68|827 River St+Troy, NY 12180|http ://www.yelp.com/biz/happy-lunch-troy|American (Traditional)|5|2
Hoosick Street Discount Beverage Center|42.74|-73.67|2200 19th St+Troy, NY 12180|http ://www.yelp.com/biz/hoosick-street-discount-beverage-center-troy|Beer, Wine & Spirits|4|5|5|5|5|4

【问题讨论】:

解决这个问题的最佳方法是编写一些代码。 @mbgda -- 我写了一些代码。它不工作,所以现在我在这里。 尝试创建一个 SSCCE 来展示您的问题并发布。 @David.Sparky:如果您的解析代码不起作用,请显示它,以便有人指出它有什么问题。 【参考方案1】:

试试这样的:

std::vector< std::vector<std::string> > vecRestaurants;

std::ifstream in("restaurants.txt");
std::string line;

while (std::getline(in, line))

    std::vector<std::string> info;

    std::istringstream iss(line);
    while (std::getline(iss, line, '|'))
        info.push_back(line);

    vecRestaurants.push_back(info);


in.close();

// use vecRestaurants as needed...

话虽如此,假设每个餐厅的字段的含义和顺序始终相同,您也可以定义一个 struct 来保存各个字段,然后创建一个 struct 值的 vector,而不是,例如:

struct sRestaurantInfo

    std::string name;
    float field2; // ie 42.74, what is this?
    float field3; // ie -73.69, what is this?
    std::string address;
    std::string url;
    std::string type;
    // what are the remaining numbers?
;

std::vector<sRestaurantInfo> vecRestaurants;

std::ifstream in("restaurants.txt");
std::string line;

while (std::getline(in, line))

    sRestaurantInfo info;

    std::istringstream iss(line);
    std::getline(iss, info.name, '|');
    std::getline(iss, line, '|'); std::istringstream(line) >> info.field2;
    std::getline(iss, line, '|'); std::istringstream(line) >> info.field3;
    std::getline(iss, info.address, '|');
    std::getline(iss, info.url, '|');
    std::getline(iss, info.type, '|');
    // read the remaining numbers if needed...

    vecRestaurants.push_back(info);


in.close();

// use vecRestaurants as needed...

【讨论】:

@Chiel 不是作业。我正在用 C++ 重做我的一些 python 代码,为下学期做准备,那时我将参加一个完全不同的 C++ 课程。

以上是关于将向量拆分为向量的向量的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量拆分为列 - 使用 PySpark

python将pandas数字向量列拆分为多列[重复]

如何通过行尾将字符串拆分为向量

将数据框列拆分为 R 中的向量

使用空格将字符串拆分为向量 c++ 错误

将 3D MatND 拆分为 2D Mat opencv 的向量