Binärstream -> konvertierung dynamischer Daten ...



  • Vorwort :

    Mir geht es nicht um eine komplette Lösung als mehr um ein Ansatzpunkt bzw ein zwei Schlagworte unter denen ich was finde was mir weiter hilft. Die Problemschilderung ist absichtlich sehr Bildlich gehalten zum besseren Verständniss.

    Folgendes Problem :

    - Ich habe Datenbestände in verschiedenen Tabellen
    - Diese Tabellen liegen als Binärstream vor
    - Die Zeilen sollen immer einen Datensatz bilden
    - Jede Tabelle hat unterschiedlich viele Spalten
    - Die Spalten haben von Tabelle zu Tabele haben unterschiedliche Datentypen zb Int string dobule float usw ...

    Vorhanden ist :

    - eine Info-Datei mit Anzahl der Spalten und Angabe des Datentyps der entsprechenden Spalte
    - Der Datenbestand selber ist in einer extra Datei ( Binär abgespeichert) vorhanden

    Was ich nun brauche ist :

    - Nen Dynamisches Array (Anzahl der Zeilen, Datensätze) von einem Dynamischen Struct (Anzahl und Datentyp der Spalten) welches mein Datensatz ist.

    Ziel ist :

    Ein Converter der die Infodatei ausliest und dadurch in der Lage ist den Datenbestand in den Speicher zu laden wo ich ihn dann weiter verarbeiten bzw bearbeiten kann.

    Ideen ? 😉

    ...

    ... Martin



  • Hallo

    Du kommst um manuelle Auswertung der Werte nicht umhin. Es gibt keine dynamischen structs, deren Member zur Laufzeit den Typ und Anzahl wechseln können.

    Wenn du wirklich zur Laufzeit dynamische Typen brauchst, ist eine polymorphe Werteklasse das richtige. So ähnlich wie es die DBE mit TField macht.
    Also du hast eine abstrakte Basisklasse Value, die nicht viel kann außer allgemeine virtuellen Methoden wie ReadFromBinaryStream und ToLabelString als Interface bereitstellen.
    Darauf setzt du abgeleitete Klassen wie IntegerValue, die für die Interface-Methoden nun konkrete Implementationen anbieten und den Wert typecht zwischenspeichern. Das ganze läßt sich mit Templates auch noch schön systematisieren.
    Du must beim Einlesen eines Datensatzes aus den Spalteninfos jeweils nacheinander ein typ-richtiges Value-Objekt erstellen (Factory-Pattern) und dann dieses Objekt seinen Wert aus dem Stream lesen lassen.
    Hast du das Interface-Konzept richtig gekapselt brauchst du im besten Fall für alle nachfolgenden Operationen von außen heraus nicht mehr zu wissen was für ein Typ eine Wertklasse genau hat, schlimmstenfalls must du casten.

    Der Container für die Struktur ist dann schnell definiert :
    Ein Datensatz ist eine dynamische Sammlung von Wert-Objekten

    typedef std::vector<BaseValue*> Record;
    

    und eine Tabelle ist eine dynamische Sammlung von Datensätzen

    typedef std::vector<Record> Table;
    

    Du must dich nur noch um die Speicherverwaltung der Werte-Objekte kümmern, die dynamischen Arrays sind dann aber selbstverwaltend.

    bis bald
    akari



  • Klasse das ging ja fix. Firma dankt, ich werd mir das gleich mal anschauen 😉


Anmelden zum Antworten