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

C++读取CSV文件时如何获取已知名称对应的单元格地址

可行解决方案

你要按Name字段匹配查询对应的Quantity、Price,本质是做键值索引,给两种可落地的实现,按需选就行:


方案1:用关联容器存储(推荐,查询效率高)

别用纯vector顺序存行,直接用std::unordered_map(C++11及以上支持)做存储:把Name作为key,把对应Quantity、Price封装成结构体作为value,查询的时候直接按key取值,时间复杂度O(1),数据量大的时候比遍历vector快很多。
完整实现示例:

#include <fstream>
#include <sstream>
#include <unordered_map>
#include <string>
#include <iostream>

// 存储单条商品的数量、价格
struct ItemInfo {
    int quantity;
    int price;
};

// 通用的字符串去前后空格工具,处理你CSV里逗号后带空格的情况
void trim(std::string& s) {
    s.erase(0, s.find_first_not_of(" \t"));
    s.erase(s.find_last_not_of(" \t") + 1);
}

int main() {
    std::unordered_map<std::string, ItemInfo> itemMap;
    std::ifstream csvFile("你的CSV文件路径.csv");
    std::string line;

    // 跳过第一行表头
    std::getline(csvFile, line);

    // 逐行解析CSV
    while (std::getline(csvFile, line)) {
        std::stringstream ss(line);
        std::string name, qtyStr, priceStr;
        std::getline(ss, name, ',');
        std::getline(ss, qtyStr, ',');
        std::getline(ss, priceStr, ',');

        trim(name); trim(qtyStr); trim(priceStr);
        itemMap[name] = {std::stoi(qtyStr), std::stoi(priceStr)};
    }

    // 已知名称查对应单元格
    std::string targetName = "xyz";
    auto findIter = itemMap.find(targetName);
    if (findIter != itemMap.end()) {
        // 拿到对应数据的引用,读、改都可以
        ItemInfo& targetInfo = findIter->second;
        std::cout << "名称:" << targetName 
                  << " 库存:" << targetInfo.quantity 
                  << " 价格:" << targetInfo.price << std::endl;
        // 要修改值直接赋值即可,比如 targetInfo.quantity = 50;
    } else {
        std::cout << "未找到对应名称的记录" << std::endl;
    }

    csvFile.close();
    return 0;
}

方案2:坚持用vector存储的实现

如果你一定要按最初的思路把所有行存在vector里也可以,只是查询的时候需要遍历整个vector匹配Name字段,数据量小的时候完全够用,数据量上千之后查询效率会比关联容器差。
核心实现逻辑:

#include <vector>
// 定义行结构,存整行的三个字段
struct ItemRow {
    std::string name;
    int quantity;
    int price;
};

int main() {
    std::vector<ItemRow> itemVec;
    // 读CSV的逻辑和上面一致,解析完每一行直接push_back到itemVec即可
    // itemVec.push_back({name, std::stoi(qtyStr), std::stoi(priceStr)});

    // 查询逻辑:遍历vector匹配Name
    std::string targetName = "abc";
    for (auto& row : itemVec) {
        if (row.name == targetName) {
            // 找到目标行,直接读写row.quantity、row.price即可
            std::cout << "库存:" << row.quantity << " 价格:" << row.price << std::endl;
            break;
        }
    }
    return 0;
}

注意事项

  • 你的CSV格式里逗号后带了空格,解析完字段一定要做去前后空格处理,否则会因为字符串带前导空格导致Name匹配失败
  • 如果存在同名的多条记录,不能用map存储(map的key唯一),只能用vector存储,遍历的时候收集所有匹配Name的行即可
  • 修改完单元格的值之后,要持久化到文件的话,重新遍历容器把所有行按CSV格式写回原文件就行

内容的提问来源于stack exchange,提问作者solopolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:57:11