Moderne C++-CSV-Reader/Parser-Bibliothek

Ich suche nach einer schönen modernen C++ CSV-Bibliothek, hauptsächlich zum Parsen.

Erforderliche Funktionen:

  • Geschrieben in modernem C++ (mindestens C++11)
  • Gratis
  • Kostenlos
  • Schnell (ja, das kann schwierig zu quantifizieren sein)

Gewünschte Funktion:

  • Header-meistens
  • Unterstützung für eine Vielzahl von CSV-Syntaxfehlern, wobei versucht wird, so viele Informationen wie möglich wiederherzustellen
  • Vorlagenbasierte Richtlinie für zusätzliche Optimierung
  • Optional Multithreading
  • Nur Kopfzeile
  • Unterstützung für Nicht-Komma-Trennzeichen
  • Getestet auf Einhaltung des CSV-Standards
  • Erfindet das Rad nicht neu – verwendet die C++-Standardbibliothek, Boost oder andere angesehene Bibliotheken, wo relevant.
  • Unterstützt das Lesen nur eines Teils einer CSV-Datei, z. B. einer Reihe von Datensätzen/Zeilen
  • Gut dokumentiert
  • „Elegant“ codiert
  • Unterstützung für das Schreiben von CSVs sowie das Lesen/Parsen von CSVs
  • Unterstützt die Vereinfachung von Annahmen, die vom Benutzer angegeben werden, z. B. ob die Zeichenfolgen in Anführungszeichen Feld- und Datensatztrennzeichen und/oder maskierte Anführungszeichen enthalten können; Felddatentypen; Feldbreiten.

Antworten (1)

Zwei Bibliotheken, die den Anforderungen und mehreren gewünschten Funktionen entsprechen:

Ich habe vor ein paar Tagen angefangen, sie zu testen, daher kann ich nicht alle Funktionen bestätigen, aber ich kann auf Details hinweisen, die meine Wahl bestimmen:

  • Rapidcsv ist das, was ich derzeit verwende, es ermöglicht das Laden von Daten als Vektoren, und Sie können Zeilenvektoren erhalten, das ist üblich, und Spaltenvektoren, das ist, wonach ich suche. Es hat zwei fehlende Funktionen, für die ich einen Fork gemacht und (sehr einfache) Verbesserungen vorgeschlagen habe: 1 Umgang mit dem Abrufen von Vektoren von nur Zeichenelementen wie std::vector (meine Daten bestehen aus räumlichen Zeitreihen, die mit SAX diskretisiert wurden, was zu a symbolische Klassierungswerte zum Beispiel von a bis z) und 2 haben Funktionen, die die Spalten- und Zeilenanzahl zurückgeben

  • CSVstream ruft Daten als Karte des Faktors ab, das ist gut für CSV, aber in meinem Fall sind Spaltennamen nicht wichtig und std:.map behält nicht die Reihenfolge der eingefügten Daten bei, und für meinen Fall muss ich die ursprüngliche Spaltenreihenfolge beibehalten weil Spaltenpositionen die räumliche Position darstellen - UPDATE: Es kann ein neues Feature sein: https://github.com/awdeorio/csvstream/issues/13#issuecomment-350701247

  • Fast C++ CSV Parser kann in meinem Fall nicht verwendet werden, da die Anzahl der Spalten zur Kompilierzeit bekannt sein muss

Diese Bewertung ist sehr anfänglich, die Baumbibliotheken erscheinen mir sehr gut, daher schlage ich vor, sie zu testen, um zu sehen, was Ihren Bedürfnissen am besten entspricht

Können Sie diese beiden Bibliotheken in wenigen Sätzen beschreiben? Etwas über ihre Unterschiede sagen?
Ja, ich suche nach etwas Ähnlichem für meinen Anwendungsfall, daher habe ich keine große Erfahrung damit, aber ich kann in der Antwort einige Tipps hinzufügen
@einpoklum Ich habe CSVstream und FastC++CSVParser verwechselt, ich habe auch ein Update für CSVstream gemacht