CSV-Dateien lesen
-
Hallo,
ich bin auf der Suche nach einer kleinen lib zum Parsen von csv-Datien (comma seperated values).
Im Netz gibt es dazu zwar jede Menge Treffer, aber nix gescheites in C++.Nun ist CSV an sich ja nicht 100% spezifiziert. Deshalb mal die Mindestanforderungen meinerseits, die wohl oft so gefordert werden:
Eine Zeile könnte Daten enthalten im Stil von
test1, 405, "Hello, World!" , -5.6 , "600", 7
dabei gilt:
- verschiedene Datensätze werden durche Komma (allgemeiner: durch ein definerbares Trennzeichen) getrennt.
- Whitespace wird ignoriert, außer er ist "gequotet".
- Durch Quotes (definierbar) werden Strings definiert, in denen sowohl Whitespace als auch Trennzeichen übernommen werden (bis zum nächsten Quote).
- Strings ohne Whitespace oder Trennzeichen müssen aber nicht unbedingt gequoted werden.Erste Frage: Kennt jemand oder hat jemand selbst ne kleine Utility-lib geschrieben die solches CSV lesen kann.
Wenn nicht, mach ich mich selbst an die Arbeit.
Damit das ganze größtmögliche Allgemeinheit erlangt, aber ohne zuviel aufwand, wie würdet ihr vorgehen?
Ich könnte mir volgendes minimales Interface vorstellen:class t_csv_reader { public: //arbeitet auf einem std::istream als Eingabe t_csv_reader(std::istream& input, char comma=',', char quote='"') //liefert den nächsten string zurück (ohne Quotes oder Trennzeichen) std::string pull(); //ähnlich ios:good zum testen ob weitere Daten gelesen werden können bool good() };Wär das sinnvoll?
Dabei wird die Interpretation der Daten völlig dem User überlassen, es werden also stets strings zurückgelifert. Eventuelle Konversion in numerische Werte muss der User selbst machen.
-
Hallo scrontch,
Suche hier im Forum nach 'csv' - da wirst Du schon einiges finden. Unter anderen einen Beitrag von mir zum Lesen aus einer csv-Datei.
scrontch schrieb:
class t_csv_reader { public: //arbeitet auf einem std::istream als Eingabe t_csv_reader(std::istream& input, char comma=',', char quote='"') //liefert den nächsten string zurück (ohne Quotes oder Trennzeichen) std::string pull(); //ähnlich ios:good zum testen ob weitere Daten gelesen werden können bool good() };Wär das sinnvoll?
Dabei wird die Interpretation der Daten völlig dem User überlassen, es werden also stets strings zurückgelifert. Eventuelle Konversion in numerische Werte muss der User selbst machen... besser ist, wenn der User gleich die Typen lesen kann, die er braucht - also int und double oder auch Datum und Zeit.
Gruß
Werner
-
Kann man natürlich machen. Ich wollte es aber erstmal so simpel wie möglich machen.
Aussderdem, was wäre denn die beste Lösung um offen für spätere Erweiterungen (durch den User) zu sein.
Könnte man evtl. selbst von istream ableiten??
So könnte man operator<<(istream&) für seine eigenen Typen überladen.
Ist es sinnvoll von istream abzuleiten?