比较同一列中的字符串
Compare strings in same column
我下载了一个图片数据库。
数据库附带一个CSV文件,该文件对每张图片进行编码,并识别图片中的重要像素。
第一列是主题的字符串代码,例如i000ra-fn
。000
是实际代码,所有字符串都以i
开头。3位数字后的字母表示不同的东西,如灯光、相机角度等。
因为主题000可以有很多张照片,由于光线和相机角度的不同,我想只保留1张。
所以我想做的是,检查第1列中以i000
开头的图片的数量。然后随机保留其中一个,随后删除其余的,无论是在我的csv文件还是在我的硬盘驱动器上。
然后我将遍历列中的每个名称,直到我已经区分的主题的数量。
我是c++的新手,不知道怎么做这个。你能给我一些建议吗?到目前为止,我已经将csv文件加载到矢量的矢量中。跳过第一列并将其加载到名为names的单独向量中。我不知道如何继续下去……有什么建议吗?
int main(int argc, const char** argv)
{
ifstream landmarksFile("muct76-opencv.csv");
string row;
string cell;
vector<vector<double>> allLandmarks;
vector<double> individualsLandmarks;
vector<string> names;
// skip headers
getline(landmarksFile, row);
// continue...
while (getline(landmarksFile, row))
{
stringstream iss(row);
while (getline(iss, cell, ','))
{
size_t found = cell.find("i");
if (found != string::npos)
{
names.push_back(cell);
}
else
{
individualsLandmarks.push_back(atof(cell.c_str()));
}
}
allLandmarks.push_back(individualsLandmarks);
individualsLandmarks.clear();
}
}
编辑:CSV文件样本…注意,列继续到x75、y75和
name tag x00 y00 x01 y01 x02 y02 x03
i000qa-fn 0 201 348 201 381 202 408 209
i000ra-fn 0 187 326 184 358 182 390 186
i000sa-fn 0 190 344 191 385 197 414 206
i001qa-mn 0 162 368 165 399 172 421 178
i001ra-mn 0 166 370 171 404 178 430 185
i001sa-mn 0 166 369 173 404 177 429 185
i002qa-mn 0 224 289 224 323 223 347 227
i002ra-mn 0 221 288 221 323 222 348 229
i002sa-mn 0 222 302 227 329 230 349 239
i003qa-fn 0 182 429 182 456 187 478 196
i003ra-fn 0 178 429 180 458 184 478 193
i003sa-fn 0 180 432 181 461 185 481 193
i004qa-mn 0 182 258 187 289 185 312 190
可在此下载:https://code.google.com/p/muct/downloads/detail?name=muct-landmarks-v1.tar.gz&can=2&q=
-
所以我要做的是检查列1中以
i000
开头的图片的数量。然后随机保留其中一个,随后删除其余的,无论是在我的csv文件还是在我的硬盘驱动器上。首先,创建一个函数,从以
i000
开头的元素中创建一个向量。不太难…template<class Container, class UnaryOp> Container container_copy_if(const Container& c, UnaryOp pred) { Container temp; std::copy_if(std::begin(c), std::end(c), std::back_inserter(temp), pred); return temp; } ... auto vector_with_only_i000 = container_copy_if(names, [] (const std::string& name) { return name.substr("i000") != std::string::npos; });
-
…然后随机保留其中一个,随后删除其余的,无论是在我的csv文件还是在我的硬盘驱动器上。
必须使用随机数生成器。下面是如何使用
std::uniform_int_distribution
:std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<int> dist(0, vector_with_only_i000.size() - 1); auto random_name = vector_with_only_i000.at(dist(rd()));
现在你有了随机的名字,你可以从原始的
names
向量中删除所有不等于random_name
的东西:auto not_equal_random_name = [&] (const std::string& name) { return name == random_name; }; names.erase( std::remove_if(names.begin(), names.end(), not_equal_random_name), names.end());
现在要从实际文件中删除它们,您需要这样做:
- 将文件中的每一行保存为矢量。
- 删除向量中不等于
random_name
的元素。 - 用新名称创建新文件
- 将矢量内容写入新文件
- 将文件重命名为旧的csv文件
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 查找矩阵C++中每一列和每一行的最小和最大元素
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用regex_replace将子字符串替换为字符串中的另一个子字符串,同时保持整个文本完整?
- 如果我有很多具有相似前缀的字符串,是否有理由从该前缀创建一个子字符串?
- 如何允许用户选择何时停止三列中的每一列的旋转
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- 如何在C++中散列字符串
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- UnicodeString 将一个子字符串替换为另一个子字符串
- 编码大于原始文本:如何获取零和一的字符串并将它们作为实际字节写入文件
- 在犰狳立方体中添加一列 1 的有效方法
- 在二维向量的每一列中查找最大值
- 只有一列适合其内容大小,而另一列则拉伸
- C 一组字符串的所有布置
- 在 c++ 中,在 for 循环中,你如何打印出一次字符串
- 如何将单独的数组分组在一起(类似于按一列对表进行排序)
- C++ 最后一列中的直方图错误
- 从向量<T>创建一组字符串
- 添加两个矩阵会打印一列垃圾数据 c++