在C++中处理CSV:库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在C++中处理CSV:库概览与实践示例



CSV(逗号分隔值)是存储表格数据最流行的格式之一。C++没有内置的CSV支持,但有许多库和方法可用于读取、写入和处理此类文件。在本文中,我们将介绍在C++中处理CSV的主要方式,包括流行的库libcsv和rapidcsv,以及使用标准工具实现解析器的方法。



为什么CSV对C++很重要?

CSV用于系统间数据交换、数据库导出、机器学习和科学计算。在C++中,处理日志、配置或从Excel导入数据的应用程序通常需要处理CSV。正确选择库可以加速开发并提高代码的可靠性。



libcsv库

libcsv是一个轻量级的C语言库,非常适合C++项目。它支持使用可自定义的分隔符、字符转义和错误处理来解析CSV。

  • 支持多种分隔符(逗号、分号、制表符)。
  • 处理转义字符串和引号。
  • 内存占用极小。

使用libcsv读取CSV的示例:

#include <csv.h>#include <iostream>#include <vector>#include <string>

struct csv_state { std::vector<std::vector<std::string>> rows;};

void cb1(void *s, size_t len, void *data) { auto *state = static_cast<csv_state*>(data); state->rows.back().push_back(std::string(static_cast<char*>(s), len));}

void cb2(int c, void *data) { auto *state = static_cast<csv_state*>(data); state->rows.emplace_back();}

int main() { struct csv_parser p; csv_init(&p, CSV_STRICT); csv_set_delim(&p, ',');

csv_state state; state.rows.emplace_back();

const char *input = "Name,Age,CityAlice,30,New YorkBob,25,London"; csv_parse(&p, input, strlen(input), cb1, cb2, &state); csv_fini(&p, cb1, cb2, &state);

for (auto &row : state.rows) { for (auto &col : row) { std::cout << col << " "; } std::cout << std::endl; }

csv_free(&p); return 0;}


rapidcsv库

rapidcsv是一个现代化的C++库,具有便捷的接口。它支持CSV的读写、自动数据类型检测以及处理表头。

  • 基于STL容器的简单API。
  • 自动将字符串转换为数字。
  • 支持自定义分隔符和编码。

使用rapidcsv读写CSV的示例:

#include <rapidcsv.h>#include <iostream>

int main() { // 写入CSV rapidcsv::Document doc("", rapidcsv::LabelParams(0, 0)); doc.SetCell<std::string>(0, 0, "Product"); doc.SetCell<int>(1, 0, 2023); doc.SetCell<double>(2, 0, 99.99); doc.Save("data.csv");

// 读取CSV rapidcsv::Document docRead("data.csv"); std::string product = docRead.GetCell<std::string>(0, 0); int year = docRead.GetCell<int>(1, 0); double price = docRead.GetCell<double>(2, 0);

std::cout << "Product: " << product << ", Year: " << year << ", Price: " << price << std::endl; return 0;}


通过C++标准工具处理CSV

如果您不想引入外部库,可以使用std::stringstream和std::getline实现解析器。这适用于没有转义的简单CSV。

#include <iostream>#include <fstream>#include <sstrea                    

推荐