C++如何将CSV格式std::string内容解析为自定义结构体的std::vector
问题描述
将CSV内容转为vector的实现方案有很多,不过我的需求和常规csv -> vector的场景略有不同:我通过CURL函数获取的CSV数据直接存储在std::string中,格式如下:
col1,col2,col3 abc,2,ghi jkl,2,pqr
所有行以\n分隔。我想将这部分数据解析为std::vector<data>类型的结果,其中data结构体定义如下:
struct data { std::string col1, col3; int col2; };
解决方案
核心思路
- 借助
std::istringstream处理CSV字符串,逐行读取内容,直接跳过表头行与空行 - 对每个有效数据行按
,分割为三个字段,依次对应结构体的三个成员 - 将第二个字段转为int类型后,组装为
data实例存入结果vector即可
完整实现代码
以下代码仅依赖C++标准库,无需引入第三方依赖:
#include <iostream> #include <string> #include <vector> #include <sstream> struct data { std::string col1, col3; int col2; }; std::vector<data> parse_csv(const std::string& csv_str) { std::vector<data> res; std::istringstream csv_ss(csv_str); std::string line; // 跳过第一行表头 std::getline(csv_ss, line); // 逐行读取数据 while (std::getline(csv_ss, line)) { // 跳过空行(处理CSV末尾多余换行的场景) if (line.empty()) continue; std::istringstream line_ss(line); std::string col1, col2_str, col3; // 按逗号拆分三个字段 std::getline(line_ss, col1, ','); std::getline(line_ss, col2_str, ','); std::getline(line_ss, col3, ','); // 组装结构体存入结果 data item; item.col1 = col1; item.col2 = std::stoi(col2_str); item.col3 = col3; res.push_back(item); } return res; } // 测试示例 int main() { std::string csv_data = R"(col1,col2,col3 abc,2,ghi jkl,2,pqr )"; auto result = parse_csv(csv_data); // 打印验证结果 for (const auto& item : result) { std::cout << "col1: " << item.col1 << ", col2: " << item.col2 << ", col3: " << item.col3 << std::endl; } return 0; }
注意事项
- 上述实现仅适用于无转义字符、字段内不含逗号/换行的简单CSV场景,如果你的实际数据包含复杂转义规则,建议使用成熟的第三方CSV解析库降低出错概率
- 生产环境使用时可以按需添加字段合法性校验逻辑,比如字段数量不足、col2无法转为int的异常捕获处理
内容的提问来源于stack exchange,提问作者asjhdbashjdbasjhdbhjb
相关产品推荐
相关产品推荐

