Работа с CSV в C++: обзор библиотек и практические примеры
CSV (Comma-Separated Values) — один из самых популярных форматов для хранения табличных данных. В C++ нет встроенной поддержки CSV, однако существует множество библиотек и подходов для чтения, записи и обработки таких файлов. В этой статье мы рассмотрим основные способы работы с CSV в C++, включая популярные библиотеки libcsv и rapidcsv, а также реализацию парсера с помощью стандартных средств.
Почему CSV важен для C++?
CSV используется для обмена данными между системами, экспорта из баз данных, машинного обучения и научных расчётов. В C++ работа с CSV часто требуется в приложениях для обработки логов, конфигураций или импорта данных из Excel. Правильный выбор библиотеки ускоряет разработку и повышает надёжность кода.
Библиотека libcsv
libcsv — легковесная библиотека на C, которая отлично подходит для C++ проектов. Она поддерживает парсинг CSV с настраиваемыми разделителями, экранированием символов и обработкой ошибок.
- Поддержка различных разделителей (запятая, точка с запятой, табуляция).
- Работа с экранированными строками и кавычками.
- Минимальное потребление памяти.
Пример чтения CSV с помощью libcsv:
#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,City\nAlice,30,New York\nBob,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, автоматическое определение типов данных и работу с заголовками.
- Простой API на основе контейнеров STL.
- Автоматическое преобразование строк в числа.
- Поддержка кастомных разделителей и кодировок.
Пример записи и чтения CSV с rapidcsv:
#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;
}
Работа с CSV через стандартные средства C++
Если вы не хотите подключать внешние библиотеки, можно реализовать парсер с помощью std::stringstream и std::getline. Это подходит для простых CSV без экранирования.
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
std::vector<std::vector<std::string>> readCSV(const std::string& filename) {
std::vector<std::vector<std::string>> data;
std::ifstream file(filename);
std::string line;
while (std::getline(file, line)) {
std::vector<std::string> Также в библиотеке
Мониторинг Node.js приложений: Инструменты и библиотеки
Elasticsearch клиент для C# (.NET): NEST и Elastic.Clients.Elasticsearch
ORM для Swift (iOS/macOS): сравнение и примеры использования
Elasticsearch REST клиент для Kotlin: руководство по использованию