Работа с CSV в C++: библиотеки и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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>                    

Рекомендаций