Современная библиотека для чтения/парсера C++ CSV

Я ищу хорошую современную библиотеку C++ CSV, в основном для синтаксического анализа.

Требуемые функции:

  • Написан на современном C++ (по крайней мере, C++11).
  • Бесплатно
  • бесплатно
  • Быстро (да, это может быть трудно оценить количественно)

Желаемая функция:

  • Заголовок-в основном
  • Поддержка широкого спектра синтаксических ошибок CSV, попытка восстановить как можно больше информации
  • Политика на основе шаблонов для дополнительной оптимизации
  • Опционально многопоточный
  • Только заголовок
  • Поддержка разделителей без запятых
  • Проверено на соответствие стандарту CSV
  • Не изобретает велосипед — использует стандартную библиотеку C++, Boost или другие известные библиотеки, где это уместно.
  • Поддерживает чтение только части файла CSV, например, диапазона записей/строк.
  • Хорошо документированы
  • "Элегантно" закодировано
  • Поддержка записи CSV, а также их чтение/анализ.
  • Поддерживает упрощающие предположения, указанные пользователем, например, могут ли строки в кавычках иметь разделители полей и записей и/или экранированные кавычки внутри них; типы данных поля; ширины поля.

Ответы (1)

Две библиотеки, которые соответствуют требованиям, и несколько желаемых функций:

Я начал тестировать их несколько дней назад, поэтому не могу подтвердить все характеристики, но могу указать на детали, определяющие мой выбор:

  • Rapidcsv - это то, что я сейчас использую, он позволяет загружать данные в виде векторов, и вы можете получать векторы-строки, которые являются общими, и векторы-столбцы, это то, что я ищу. У него есть две недостающие функции, для которых я сделал вилку и предлагаю (очень просто) улучшения: 1 обработка извлечения векторов только элементов char, таких как std::vector (мои данные состоят из пространственных временных рядов, дискретизированных с использованием SAX, что приводит к символические значения биннинга, например, от a до z), а 2 имеют функции, которые возвращают количество столбцов и строк.

  • CSVstream извлекает данные в виде карты fector, что хорошо для CSV, но в моем случае имена столбцов не важны, а std:.map не сохраняет порядок вставленных данных, и в моем случае мне нужно сохранить исходный порядок столбцов потому что позиции столбцов представляют пространственное положение - ОБНОВЛЕНИЕ: это может быть новая функция: https://github.com/awdeorio/csvstream/issues/13#issuecomment-350701247

  • Fast C++ CSV Parser нельзя использовать в моем случае, потому что количество столбцов должно быть известно во время компиляции.

Эта оценка является очень начальной, библиотеки деревьев кажутся мне очень хорошими, поэтому я предлагаю протестировать их, чтобы увидеть, что лучше всего соответствует вашим потребностям.

Можете ли вы описать эти две библиотеки в нескольких предложениях? Скажите что-нибудь об их различиях?
Да, я ищу что-то похожее для своего варианта использования, поэтому у меня нет большого опыта с ними, но я могу добавить несколько советов, в ответ
@einpoklum Я перепутал CSVstream и FastC++CSVParser, я также сделал обновление для CSVstream