Text-Tabelle auslesen: Spaltenreihenfolge soll variabel werden...
-
Hallo,
ich programmiere gerade eine WIN32 Konsolenapplikation, die mit einer Tabelle, die von dem Benutzer kommt, gefüttert wird und die Daten verarbeitet. Das funktioniert soweit gut. Nun möchte ich dem Benutzer die Möglichkeit geben, die Spalten zu vertauschen. Wie kann man so etwas realisieren? (Wie soll der Benutzer später dem Programm mitteilen, in welcher Reihenfolge es die Tabellenspalten auszulesen hat?)
Ein Beispiel:
Tabelle:
VORNAME | NACHNAME --------+--------- Klaus | Meier Willy | Bauer Martin | Richter
Programm:
struct NAMEN { std::string strVorname, strNachname; }; bool TabelleParsen(const std::string &strTabelle, NAMEN &grNamen) { //... ? }
Die Tabelle soll aber z.B. auch so aussehen dürfen:
NACHNAME | VORNAME ---------+-------- Meier | Klaus Bauer | Willy Richter | Martin
Vielen Dank!
-
sollen alle spalten variabel sein`?
oder nur die erste variabel sein und die reihenfolge des rests soll so bleiben?bb
-
unskilled schrieb:
sollen alle spalten variabel sein`?
oder nur die erste variabel sein und die reihenfolge des rests soll so bleiben?bb
Eigentlich sollen ja alle Spalten variabel sein. Es sind auch noch viel mehr Spalten vorhanden als im Beispiel
-
Keiner eine Idee?
-
Linuzz schrieb:
Keiner eine Idee?
Im Prinzip schon.
Man nehme einen Sack mit Funktoren, die alle eine gemeinsame Basisklasse haben und eine Schnittstelle zum Einlesen genau eines der Member der Klasse.
Beim Einlesen der Überschrift werden diese Funktoren in der Reihenfolge generiert, die in der Überschrift steht. Z.B. in einen Container. Und für jede folgende Zeile werden diese dann in der festgelegten Reihenfolge aufgerufen und es wird jeweils ein Objekt der Klasse 'NAMEN' gefüllt.
Die Funktoren haben selber keinen Zustand und werden am Ende wieder gelöscht.So ganz grob:
class LeseBasis { public: virtual void lese( std::istream& in, NAMEN& obj ) const =0; }; // konkrete Klasse; z.B. für den Nachnamen class LeseNachname : public LeseBasis { public: virtual void lese( std::istream& in, NAMEN& obj ) const { std::string nachname; in >> .. lese bis '|' oder EOL obj.strNachname = nachname; } }; template< typename Out > void TabelleParsen( std::istream& in, Out out ) // iterator_traits< Out >::value_type == NAMEN { std::vector< LeseBasis* > leser; // 1.) Überschrift lesen for(;??;) { std::string token; in >> token; // noch '|' oder EOL berücksichtigen if( token == NACHNAME ) leser.push_back( new LeseNachnamen ); else if( token == VORNAME ) leser.push_back( new LeseVornamen ); // ... } // 2.) Objekte einlesen for( ; in; ) { NAMEN name; for( std::vector< LeseBasis* >::iterator iLeser = leser.begin() ; iLeser != leser.end(); ++iLeser ) { leser->lese( in, name ); } if( in ) // Lesestream noch iO *out++ = name; // wegspeichern } }
Gruß
Werner
-
Einfach eine Liste von Listen, wo ist das Problem?
-
Und wenn selbst die Spaltentitel variieren können sollen?
-
Wenn du deine struct NAMEN behalten willst, dann mach halt noch ein array "Titel" und "AnzeigeReihenfolge", die du mit abspeichertst.
-
Normalerweise trennt man Daten von der Ansicht, d.h. dein Datenmodell ist eigentlich unverändert, nur die GUI kümmert sich drum, wie die Daten angezeigt werden. In deinem Beispiel stehen die Vornamen immer in Spalte 0 und die Nachnamen immer in Spalte 1. Wenn du über den Spaltenindex gehst ist es auch völlig unerheblich, die die einzelnen Spalten heissen.
Du brauchst für deine Anzeige dann noch die Informationen, in welcher Tabellenspalte welchen Datenindex benutzt, z.B. kann Tabellenspalte 0 die Nachnamen anzeigen und hätte damit Datenindex 1. Das musst du bei der Eingabe natürlich auch berücksichtigen.
-
DocShoe schrieb:
[...] Du brauchst für deine Anzeige dann noch die Informationen, in welcher Tabellenspalte welchen Datenindex benutzt [...]
Und wie genau das in einem Programm umgesetzt werden muss, wollte ich von euch erfahren (seit dem ersten Beitrag).
-
Linuzz schrieb:
DocShoe schrieb:
[...] Du brauchst für deine Anzeige dann noch die Informationen, in welcher Tabellenspalte welchen Datenindex benutzt [...]
Und wie genau das in einem Programm umgesetzt werden muss, wollte ich von euch erfahren (seit dem ersten Beitrag).
Da ist schon ein bisschen Eigeninitiative gefragt... welche Eigenschaften hat denn so eine Tabellenspalte? Wie könnte ein Objekt aussehen, das diese Eigenschaften hat? Wie könnte man diese Objekte organisieren?
-
Linuzz schrieb:
DocShoe schrieb:
[...] Du brauchst für deine Anzeige dann noch die Informationen, in welcher Tabellenspalte welchen Datenindex benutzt [...]
Und wie genau das in einem Programm umgesetzt werden muss, wollte ich von euch erfahren (seit dem ersten Beitrag).
.. Hmm!? daraus schließe ich das Du meinen Beitrag noch nicht gelesen hast - oder?