Biblioteca moderna de lector/analizador C++ CSV

Estoy buscando una biblioteca C++ CSV agradable y moderna, principalmente para analizar.

Características requeridas:

  • Escrito en C++ moderno (C++11 al menos)
  • Gratis
  • Gratis
  • Rápido (sí, esto puede ser difícil de cuantificar)

Característica deseada:

  • Encabezado-principalmente
  • Soporte para una amplia variedad de errores de sintaxis CSV, tratando de recuperar la mayor cantidad de información posible
  • Política basada en plantillas para optimización adicional
  • Opcionalmente multiproceso
  • Solo encabezado
  • Compatibilidad con separadores sin coma
  • Probado para cumplir con el estándar CSV
  • No reinventa la rueda: utiliza la biblioteca estándar de C++, Boost u otras bibliotecas reconocidas cuando sea relevante.
  • Admite la lectura de solo una parte de un archivo CSV, por ejemplo, un rango de registros/líneas
  • Bien documentada
  • Codificado "elegantemente"
  • Soporte para escribir CSV, así como para leerlos/analizarlos
  • Admite suposiciones simplificadas indicadas por el usuario, por ejemplo, si las cadenas citadas pueden tener separadores de campos y registros y/o comillas escapadas dentro de ellas; tipos de datos de campo; anchos de campo.

Respuestas (1)

Dos bibliotecas que se ajustan a los requisitos y varias de las características deseadas:

Empecé a probarlos hace unos días, por lo que no puedo confirmar todas las características, sin embargo, puedo señalar algunos detalles que están definiendo mi elección:

  • Rapidcsv es lo que estoy usando actualmente, permite cargar datos como vectores, y puede obtener vectores de fila, que es común, y vectores de columna, que es lo que estoy buscando. Tiene dos funciones faltantes por las que hice una bifurcación y propuse (muy simplemente) mejoras: 1 manejo de la recuperación de vectos de solo elementos de caracteres como std::vector (mis datos se componen de series de tiempo espacial discretizadas usando SAX, que da como resultado un valores de agrupamiento simbólicos, por ejemplo, de la a a la z), y 2 tienen funciones que devuelven los recuentos de columnas y filas

  • CSVstream recupera datos como un mapa de factor, eso es bueno para CSV pero en mi caso los nombres de columna no son importantes y std:.map no mantiene el orden de los datos insertados, y en mi caso necesito mantener el orden de columna original porque las posiciones de las columnas representan la posición espacial - ACTUALIZACIÓN: puede ser una característica nueva: https://github.com/awdeorio/csvstream/issues/13#issuecomment-350701247

  • Fast C ++ CSV Parser no se puede usar en mi caso porque la cantidad de columnas debe conocerse en el momento de la compilación

Esta evaluación es muy inicial, las bibliotecas de árboles me parecen muy buenas, por lo que sugiero probarlas para ver cuál se adapta mejor a sus necesidades.

¿Puedes describir estas dos bibliotecas en unas pocas oraciones? Decir algo sobre sus diferencias?
Sí, estoy buscando algo similar para mi caso de uso, por lo que no tengo mucha experiencia con ellos, pero puedo agregar algunos consejos en la respuesta.
@einpoklum Hice una confusión entre CSVstream y FastC++CSVParser, también hice una actualización para CSVstream