CSV Tabelle umwandeln
-
Hallo an alle,
nach 5 Tagen Arbeit (in Java) darf ich nun von vorne anfangen da ich festgestellt habe das mein Code absoluter Schrott ist. Kommt davon wenn man sich keine großen Gedanken vorher macht.
Ich würde gerne mal hören wie ihr das evtl. Lösen würdet. Zum Problem:
Ich habe eine CSV Datei welche ich einlesen muss.Die Tabelle muss nun so umgewandelt werden :
Von:
ID|Alter|Geschlecht
1 |15 |w
2 |12 |min:
ID|Alter_15|Alter_12|Geschlecht_w|Geschlecht_m|
1 |1 |0 |1 |0
2 |0 |1 |0 |1Sorry für die Schlechte Darstellung.
Was würdet ihr verwenden? Tools, Datentypen etc.
Ich habe es in Java mal versucht und bin dann durch die Komplexität des Programms erschlagen worden.
Bitte rettet mich.
-
Ich würde vermutlich QFile, QString, QStringList und QTextStream nutzen ... da ich zZ in Qt unterwegs bin ... es geht sicher auch mit std::string, ifstream, ofstream, getline und ein bisschen string-magic ... wobei mich das alter_15|alter_12 irritiert ... solange du nur die 2 hast ists ja noch ok aber wenn du ne gaussverteilte Altersangabe annimmst wird das n sehr breites Format ...
-
Du fragst also allgemein nach Werkzeugen, nicht bloß in C++?
Ist mit awk, sed, eventuell auch python ganz einfach. In C++ auch ganz gut machbar mit geschicktem Einsatz von set und map.
-
padreigh schrieb:
Ich würde vermutlich QFile, QString, QStringList und QTextStream nutzen ... da ich zZ in Qt unterwegs bin ... es geht sicher auch mit std::string, ifstream, ofstream, getline und ein bisschen string-magic ... wobei mich das alter_15|alter_12 irritiert ... solange du nur die 2 hast ists ja noch ok aber wenn du ne gaussverteilte Altersangabe annimmst wird das n sehr breites Format ...
OK. QT fällt vorerst weg. Die Tabelle war nur ein Beispiel. Hast aber recht.
-
SeppJ schrieb:
Du fragst also allgemein nach Werkzeugen, nicht bloß in C++?
Ist mit awk, sed, eventuell auch python ganz einfach. In C++ auch ganz gut machbar mit geschicktem Einsatz von set und map.
Ich habe es mal mit Sets und Maps probiert. Leider komme ich damit bisher nicht auf einen grünen zweig.
Hast du vllt. ein snippet oder ein Link wo ich das mal durchlesen kann?
-
Croatiancow schrieb:
Ich habe es mal mit Sets und Maps probiert. Leider komme ich damit bisher nicht auf einen grünen zweig.
Hast du vllt. ein snippet oder ein Link wo ich das mal durchlesen kann?
Hier mal eine einfache Demo, wie man so schön sagt mit der heißen Nadel gestrickt, also erwarte keinen schönen Code. Die genauere Anpassung überlasse ich dir. Das meiste sollte für sich selber sprechen und ich habe Wert gelegt auf Erweiterbarkeit. Zum Beispiel ist es schon jetzt kein Problem, dass ein Datensatz eine 1 in mehreren Feldern einer Kategorie haben kann. Da ich (hoffentlich) ausreichend sprechende Namen benutzt habe, sollten Kommentare nur selten nötig sein.
#include <map> #include <iostream> #include <string> #include <vector> #include <set> using namespace std; string age_base="A_"; template <string *base> class DatenMapper { private: map<string, int> data; static set<string> &values(){static set<string> internal; return internal;} // Kleiner Trick um die üblichen Probleme bei der Definition von static-Variablen zu umgehen public: void insert(const string &value) { values().insert(value); data.insert(pair<string,int>(value,1)); } static void write_header(ostream &out) { for (set<string>::iterator it=values().begin(); it != values().end(); ++it) out<<'\t'<<*base<<*it; } void write(ostream &out) { for (set<string>::iterator it=values().begin(); it != values().end(); ++it) out<<'\t'<< data[*it]; } }; class Datensatz { private: string id; DatenMapper<&age_base> ages; public: Datensatz(const string &id, const string &age): id(id) { ages.insert(age); } void write(ostream &out) { out<<id; ages.write(out); } static void write_header(std::ostream &out) { out << "ID"; DatenMapper<&age_base>::write_header(out); out << endl; } }; ostream &operator<<(ostream &out, Datensatz& data) { data.write(out); return out; } int main() { vector<Datensatz> data; set<string> existing_ages; { // Read data string id, age; while(cin >> id >> age) data.push_back(Datensatz(id,age)); } Datensatz::write_header(cout); for (vector<Datensatz>::iterator it=data.begin(); it != data.end(); ++it) cout << *it << endl; }Aus folgender Eingabe:
1 12 2 56 3 12 4 5 5 78Wird dies:
ID A_12 A_5 A_56 A_78 1 1 0 0 0 2 0 0 1 0 3 1 0 0 0 4 0 1 0 0 5 0 0 0 1edit: Das Forum mach komische Dinge mit Tabs, wie du hier siehst. Das ist nicht meine Schuld.
-
Oh Gott was für eine Blamage. Ich habe 5 Tage daran gearbeitet und komme nicht zur Lösung. Da wird einem die Tatsache das das Internet nie vergisst zum Verhängnis.
Vielen Dank. Ich probier das gleich mal aus und passe es an.
-
Source:
#include <iostream> #include <fstream> #include <sstream> #include <iomanip> int main() { std::ifstream inFile("a.txt"); const char Delim = ';'; std::string line; while (std::getline(inFile, line)) { std::stringstream strm(line); std::string val; while (std::getline(strm, val, Delim)) { std::cout << val << std::setw(30); } std::cout << std::setw(0) << std::endl; } return 0; }Texdtdatei:
Id;Vorname;Nachname
1;Patrick;Star
2;Spongebob;Schwammkopf
3;Tom;Hanks
4;Barack;Obama