1、手动解析 CSV 文件
使用标准 C++ 库(如 fstream)来读取文件并手动解析每一行。这种方法适合简单的 CSV 文件,并且可以根据需要进行自定义。CSVRow
类 用于存储并管理每一行的数据。readNextRow()
方法从输入流中读取一行数据,并根据逗号分割各个字段。
#include <iterator> #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <string> #include <string_view> class CSVRow { public: // 按索引访问行中的元素 std::string_view operator[](std::size_t index) const { if (index >= m_data.size() - 1) { throw std::out_of_range("Index out of range"); } return std::string_view(&m_line[m_data[index] + 1], m_data[index + 1] - (m_data[index] + 1)); } // 返回行中的字段数量 std::size_t size() const { return m_data.size() - 1; } // 从输入流中读取下一行 void readNextRow(std::istream& str) { std::getline(str, m_line); // 读取完整的一行到 m_line m_data.clear(); m_data.emplace_back(-1); // 从第一个字符的前面开始 std::string::size_type pos = 0; while ((pos = m_line.find(',', pos)) != std::string::npos) { m_data.emplace_back(pos); // 存储每个逗号的位置 ++pos; // 跳过逗号 } m_data.emplace_back(m_line.size()); // 添加行结束时的位置 } private: std::string m_line; // 整行的字符串 std::vector<std::size_t> m_data; // 存储逗号和行尾位置的向量 }; // 重载 >> 操作符,从输入流中读取 CSV 行 std::istream& operator>>(std::istream& str, CSVRow& data) { data.readNextRow(str); return str; } int main() { // 打开 CSV 文件 std::ifstream file("D:\\1.csv"); if (!file.is_open()) { std::cerr << "Failed to open the file!" << std::endl; return 1; } CSVRow row; // 遍历 CSV 文件中的每一行 while (file >> row) { // 如果有第 4 个元素(索引 3),则打印它 if (row.size() > 3) { std::cout << "4th Element(" << row[3] << ")\n"; } else { std::cout << "Row does not have a 4th element.\n"; } } return 0; }
2、使用第三方 CSV 解析库
CSV 文件包含复杂的格式(如引号内的逗号或换行符),手动解析可能会变得复杂。在这种情况下,可以使用第三方库来处理 CSV 文件。
1)安装 csv-parser
库
需要安装 csv-parser
库。可以使用以下命令安装,
# 使用 Git 克隆并安装 csv-parser git clone https://github.com/vincentlaucsb/csv-parser.git cd csv-parser make
2)使用csv-parser
库读取 CSV 文件
#include <iostream> #include <csv.h> // 引入 csv-parser 库 int main() { io::CSVReader<4> in("plop.csv"); // 读取文件,假设文件有 4 列 in.read_header(io::ignore_extra_column, "Name", "Surname", "Age", "Job"); std::string name, surname, job; int age; while (in.read_row(name, surname, age, job)) { // 逐行读取 std::cout << "Name: " << name << ", Surname: " << surname << ", Age: " << age << ", Job: " << job << std::endl; } return 0; }