如何使用C++提取CSV文件中包含指定位置信息的特定数据行
C++ CSV指定位置行筛选实现
我们正在使用C++对CSV文件进行数据抓取,希望筛选出包含指定位置信息的特定行,文件结构如下:
原有代码仅能将文件所有内容存入vector,未实现筛选Back Bay相关行的逻辑,以下是可直接使用的实现方案:
基础筛选实现(匹配行存入单个vector)
你可以在读取行的循环中添加匹配逻辑,优先推荐按列精准匹配,避免其他字段出现关键词导致误筛选,修改后的完整代码如下:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <algorithm> // CSV行拆分工具函数,默认按逗号分隔 std::vector<std::string> split_csv(const std::string& s, char delimiter = ',') { std::vector<std::string> tokens; std::string token; for (char c : s) { if (c == delimiter) { tokens.push_back(token); token.clear(); } else { token += c; } } tokens.push_back(token); return tokens; } void readFileVector(std::string fileName, std::vector<std::string>& fileVector) { // 搜索关键词 std::string key = "Back Bay"; // 位置信息所在列的索引(从0开始计数,根据你的CSV实际结构调整) const int POS_COLUMN = 1; std::ifstream file(fileName.c_str()); if (!file) { std::cerr << "文件无法打开: " << fileName << std::endl; return; } std::string line; // 如果CSV有表头,可取消下面这行注释跳过表头 // std::getline(file, line); while (getline(file, line)) { std::vector<std::string> columns = split_csv(line); // 校验列数合法且位置列匹配关键词 if (columns.size() > POS_COLUMN && columns[POS_COLUMN] == key) { // 打印匹配到的行 std::cout << "匹配行:" << line << std::endl; fileVector.push_back(line); } } file.close(); }
如果你的CSV结构简单不会出现字段混淆,也可以把列匹配逻辑替换为简单字符串匹配:if (line.find(key) != std::string::npos),代码更简洁。
多vector存储实现
如果需要将匹配行的不同字段分别存入多个vector,可参考以下改造后的函数:
// 示例:三个vector分别存储时间、位置、价格,可根据你的实际字段增减 void readFileMultiVector(std::string fileName, std::vector<std::string>& time_vec, std::vector<std::string>& pos_vec, std::vector<double>& price_vec) { std::string key = "Back Bay"; // 各字段对应的列索引,根据实际CSV调整 const int TIME_COLUMN = 0; const int POS_COLUMN = 1; const int PRICE_COLUMN = 2; std::ifstream file(fileName.c_str()); if (!file) { std::cerr << "文件无法打开: " << fileName << std::endl; return; } std::string line; while (getline(file, line)) { std::vector<std::string> columns = split_csv(line); // 校验列数充足且位置匹配 if (columns.size() > std::max({POS_COLUMN, TIME_COLUMN, PRICE_COLUMN}) && columns[POS_COLUMN] == key) { time_vec.push_back(columns[TIME_COLUMN]); pos_vec.push_back(columns[POS_COLUMN]); price_vec.push_back(std::stod(columns[PRICE_COLUMN])); } } file.close(); }
优化建议
- 如果CSV存在带逗号的引号包裹字段,建议替换手动拆分逻辑为成熟的轻量CSV解析工具,避免解析错误
- 大文件读取场景下可提前预分配vector空间,提升读取效率
- 可将搜索关键词、列索引改为函数入参,提升代码复用性
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

