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?


Log in to reply