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
相关产品推荐
相关产品推荐

