CSVs parsen
-
Hi,
ich würde gerne mit C++-Streams CSVs parsen. Also muss ich dem Stream ja nur irgendwie mitteilen, dass er ',' als Zeichen nutzen soll, wonach er mit << stoppen soll. Aber ich will auch nach '\n' stoppen und insbesondere zwischen ',' und '\n' unterscheiden, da eine neue Zeile nicht das gleiche wie eine neue Spalte ist.
Leider bin ich der Sprache wieder nicht mächtig genug. Hat jemand einen Codefetzen oder eine Idee? Ich habe dunkel im Kopf, dass man mit get etwas erreichen kann und dann je nach Zeichen entweder weiterleitet oder das Zeichen für << durchreicht. Aber ich habe leider keine Details dazu im Kopf. -.-
Jemand eine Idee?
(Ich kann das natürlich auch über getline in Zeilen stecken und diese dann mit find oder boost-Zeug parsen, aber obige Variante ist einfach eleganter :))
-
Hallo Eisflamme,
bist Du nicht lange genug dabei, dass Du dass hier nicht schon gesehen hast?
Aber ok - hier noch mal ein Beispiel. Angenommen die CSV-Datei sieht so aus:23,das ist ein Text,3.14 24,mehr Text,-1.012E-12
dann kann man das mit diesem Programm lesen:
#include <fstream> #include <iostream> #include <string> template< char C > std::istream& Char( std::istream& in ) { char c; if( in >> c && c != C ) in.setstate( std::ios_base::failbit ); return in; } struct Beispiel { int m_x; std::string m_text; double m_d; // -- Einlesen der Struktur; Format: m_x,text text text,m_d friend std::istream& operator>>( std::istream& in, Beispiel& s ) { return getline( in >> s.m_x >> Char<','>, s.m_text, ',') >> s.m_d; } }; int main() { using namespace std; ifstream in( "input.csv" ); if( !in.is_open() ) { cerr << "Fehler beim Oeffnen der Datei" << endl; return -1; } for( Beispiel s; in >> s; ) { // mache was mit der gelesenen Struktur (Zeile) cout << s.m_text << endl; } return 0; }
ansonsten suche hier im Forum nach 'csv' und mich als Autor. Z.Beispiel Musiktitel einlesen oder einen Haufen int einlesen.
Gruß
Werner
-
Vorallem gab es schon eine ähnliche Fragestellung von ihm:
http://www.c-plusplus.net/forum/285373
-
Hi,
lange dabei, ja, und auch das gelesen, was Du geschrieben hast. Aber ich habe es nie umgesetzt und nie das tiefe Verständnis entwickelt oder mich damit lange beschäftigt. Außerdem bist Du in solchen Sachen einfach genial, da werde ich so schnell nicht hinkommen.
Vielen Dank für das Beispiel! Und in Zukunft google ich Deine Beiträge auf die von Dir erwähnte Variante!
jlkjkl:
...Ok, das tut mir jetzt echt Leid. Ich hab den Beitrag gelesen und dachte "hä?". Ich habe das komplett vergessen.
Nehmt Rücksicht auf mich, anscheinend hab ich schon irgendeine schwerwiegende Gedächtniskrankheit.
-
Und was machst du mit einer CSV Datei in deutscher Sprache ?
23,das ist ein Text,"3,14" 24,mehr Text,"-1,012E-12"
Und was machst du wenn das Feldtrennzeichen ; ist und nicht , ?
23;das ist ein Text;3,14 24;mehr Text;-1,012E-12
Ich glaube es wäre hier eine gute Übung einen zustandsbasierten Parser zum Interpretieren einer CSV Zeile zu modellieren und implementieren.