Trabalhando com CSV em C++: visão geral das bibliotecas e exemplos práticos
CSV (Comma-Separated Values) — um dos formatos mais populares para armazenar dados tabulares. Em C++ não há suporte embutido para CSV, no entanto, existem muitas bibliotecas e abordagens para ler, escrever e processar esses arquivos. Neste artigo, veremos as principais formas de trabalhar com CSV em C++, incluindo as bibliotecas populares libcsv e rapidcsv, bem como a implementação de um parser usando ferramentas padrão.
Por que o CSV é importante para C++?
CSV é usado para troca de dados entre sistemas, exportação de bancos de dados, aprendizado de máquina e cálculos científicos. Em C++, o trabalho com CSV é frequentemente necessário em aplicações para processamento de logs, configurações ou importação de dados do Excel. A escolha correta da biblioteca acelera o desenvolvimento e aumenta a confiabilidade do código.
Biblioteca libcsv
libcsv — uma biblioteca leve em C, que é excelente para projetos C++. Ela suporta parsing de CSV com delimitadores configuráveis, escape de caracteres e tratamento de erros.
- Suporte a vários delimitadores (vírgula, ponto e vírgula, tabulação).
- Trabalho com strings escapadas e aspas.
- Consumo mínimo de memória.
Exemplo de leitura de CSV com 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,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;}Biblioteca rapidcsv
rapidcsv — uma biblioteca C++ moderna com interface amigável. Ela suporta leitura e escrita de CSV, detecção automática de tipos de dados e trabalho com cabeçalhos.
- API simples baseada em contêineres STL.
- Conversão automática de strings para números.
- Suporte a delimitadores e codificações personalizados.
Exemplo de escrita e leitura de CSV com rapidcsv:
#include <rapidcsv.h>#include <iostream>
int main() { // Escrita de 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");
// Leitura de 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;}Trabalhando com CSV através de ferramentas padrão do C++
Se você não quiser incluir bibliotecas externas, pode implementar um parser usando std::stringstream e std::getline. Isso é adequado para CSV simples sem escape.
#include <iostream>#include <fstream>#include <sstrea Também na biblioteca
Parsing de HTML em Java: bibliotecas Jsoup e HtmlUnit
Trabalhando com arquivos ZIP em Rust: biblioteca zip e guia completo
Logging para Swift: biblioteca SwiftyBeaver
Cliente Redis para PHP: Predis e PhpRedis – conexão e exemplos