You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C++提取CSV文件中包含指定位置信息的特定数据行

C++ CSV指定位置行筛选实现

我们正在使用C++对CSV文件进行数据抓取,希望筛选出包含指定位置信息的特定行,文件结构如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:06:05