我试图编写代码,这些代码将逐行地将数字数据从CSV传递到对象的向量。对象的结构如下:对象本身(让我们称之为CS
)是一个封闭的空间,其中包含一个对象向量(称为Points
)有一个带有3个变量的对象向量(Features
)。这些特征中的前两个变量是特征的描述符,第三个是特定Point[i].Feature[j]
所采用的实际值。每个点具有相同的特征集,除了第三个值不同之外,描述符同样相同。 (编辑:可悲的是,我不能改变这种结构,因为它是一个不在我手中的更大框架的一部分)
目前,我的CSV每个要素都有一列,前两行是适用于所有点的描述符,其余行是每个单独点的第三个特征值。自从我的C ++课程开始以来已经有一段时间了,我发现很难想到实现这一目标的快速方法,因为我的CSV可能变得相当大(我目前的上限是50000点,有2000个功能) ,这可能会增长)而且我不想做一些愚蠢的事情,比如每次重读每一点的前两行。我环顾四周,大多数CSV解决方案涉及字符串CSV,我不需要处理,以及存储CSV的简单数组对象。对我来说,问题只是每次到达生产线末端并重新启动下一点的程序时都会上升一级,我无法想到任何事情。有什么提示吗?
答案 0 :(得分:0)
您可以创建一个Descriptor
个对象的临时数组,其中包含每列的两个描述符,然后在第一行中读取并从中创建Point
个对象。之后,您只需复制上面Point
行中的描述符,例如: Point[i-csvWidth]
,并取消分配Descriptor
数组。
答案 1 :(得分:0)
我想我差不多就在那里,只是使用了错误的变量来读入。
fstream myFile;
myFile.open(filePath.c_str());
if(!myFile){
cout << "File \"" << filePath << "\" doesn't exist, exiting program." << endl;
exit(EXIT_FAILURE);
}
string line,line2,line3;
Points.clear();
//gets the range row
getline(myFile,line);
istringstream lineStream(line);
//gets the nomin row
getline(myFile,line2);
istringstream lineStream2(line2);
//gets the first person's traits
getline(myFile,line3);
istringstream lineStream3(line3);
CultVec originalCultVec = CultVec(RNG);
int val,val2,val3,val4;
while (lineStream >> val && lineStream2 >> val2 && lineStream3 >> val3) {
Feature feature;
feature.Range = (char)val;
feature.Nomin = (bool)val2;
feature.Trait = (char)val3;
originalCultVec.addFeature(feature);
} // while
Points.push_back(originalCultVec);
while (getline(myFile,line)) {
int i = 0;
CultVec newVec = CultVec(RNG);
istringstream lineStream4(line);
while ( lineStream4 >> val4 ) {
Feature newFeat = originalCultVec.getFeature(i);
newFeat.Trait = (char)val4;
newVec.addFeature(newFeat);
i++;
}
Points.push_back(newVec);
}