乐闻世界logo
搜索文章和话题

如何在C++中读取和解析CSV文件?

5 个月前提问
4 个月前修改
浏览次数75

1个答案

1

在C++中读取和解析CSV文件通常涉及以下步骤:

  1. 打开文件:使用文件流(例如 std::ifstream)来打开CSV文件。
  2. 读取文件内容:按行读取文件内容,并对每一行进行解析。
  3. 解析每行:通常使用逗号作为分隔符来分割每行的内容,得到单独的字段。
  4. 存储解析结果:将解析出的数据存储在适当的数据结构中(如std::vectorstd::map)。
  5. 处理可能的异常:处理文件打开失败、格式错误等可能的异常。

下面是一个具体的例子,展示了如何在C++中实现这个过程:

cpp
#include <iostream> #include <fstream> #include <sstream> #include <vector> #include <string> // 定义一个用来存储CSV数据的简单结构 struct Person { std::string name; int age; std::string city; }; // 函数用于读取CSV文件并解析数据 std::vector<Person> readCSV(const std::string& filename) { std::vector<Person> people; std::ifstream file(filename); // 检查文件是否成功打开 if (!file.is_open()) { throw std::runtime_error("Cannot open file"); } std::string line; // 读取文件的每一行 while (getline(file, line)) { std::istringstream s(line); std::string field; Person person; // 按逗号分割每行数据 getline(s, person.name, ','); getline(s, field, ','); person.age = std::stoi(field); // 将字符串转换为整数 getline(s, person.city, ','); // 将解析的数据添加到vector中 people.push_back(person); } file.close(); return people; } int main() { const std::string filename = "data.csv"; try { std::vector<Person> people = readCSV(filename); for (const Person& person : people) { std::cout << "Name: " << person.name << ", Age: " << person.age << ", City: " << person.city << std::endl; } } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; }

在这个例子中:

  • 我们定义了一个Person结构来存储每一条CSV记录。
  • 使用std::ifstream来读取文件,并逐行解析。
  • 使用std::istringstreamgetline分割字符串。
  • 处理了文件打开失败的异常。

这种方式简洁明了,适用于简单的CSV文件解析任务。对于包含引号、换行等复杂CSV格式的文件,可能需要更复杂的解析策略或使用现成的库如Boost Tokenizer

2024年6月29日 12:07 回复

你的答案