Frage

Ich habe vor kurzem über Protokollpuffer gefunden und frage mich, ob sie zu meinem speziellen Problem angewendet werden könnte.

Im Prinzip habe ich einige CSV-Daten, die ich brauche, um ein kompakteres Format für die Speicherung zu konvertieren, da einige der Dateien mehrere gig sind.

Jedes Feld in der CSV hat einen Header, und es gibt nur zwei Arten, Strings und Dezimalzahlen (weil manchmal gab eine Menge von signifikanten Stellen sind, und ich brauche alle Zahlen die gleiche Art und Weise zu handhaben). Aber jede Datei wird für jedes Feld verschiedene Spaltennamen hat.

Neben die ursprüngliche CSV Datenerfassung Ich brauche zusätzliche Informationen in die Datei hinzufügen zu können, vor dem Speichern. Und ich hatte gehofft, dass diese zukunftssichere Versionen durch den Umgang mit unterschiedlichen Datei zu machen.

So ist es möglich, Protokoll-Puffer zu verwenden, um eine beliebige Anzahl von zufällig benannte Spalten von Daten zu erfassen, wie ein CSV-Datei?

War es hilfreich?

Lösung

Nun, es ist sicherlich darstellbare. So etwas wie:

message CsvFile {
    repeated CsvHeader header = 1;
    repeated CsvRow row = 2;
}

message CsvHeader {
    require string name = 1;
    require ColumnType type = 2;
}

enum ColumnType {
    DECIMAL = 1;
    STRING = 2;
}

message CsvRow {
    repeated CsvValue value = 1;
}

// Note that the column is implicit based on position within row    
message CsvValue {
    optional string string_value = 1;
    optional Decimal decimal_value = 2;
}

message Decimal {
    // However you want to represent it (there are various options here)
}

Ich bin nicht sicher, wie viel Nutzen sie bieten werden, Geist Sie ... Sie können sicherlich mehr Informationen hinzufügen (fügt die csvfile Nachricht) und Zukunftssicherheit ist in dem „normalen PB way“ - nur optionale Felder hinzufügen, etc.

Andere Tipps

Nun, protobuf-net (meine Version) auf regelmäßigem .NET-Typ basiert, so dass keine (da es nicht mit verschiedenen Schemata der ganzen Zeit fertig zu werden). Aber Jons Version könnte dynamische Typen ermöglichen. Persönlich würde ich nur CSV verwenden und es durch GZipStream laufen -. Ich gehe davon aus, dass zum Zwecke in Ordnung


Edit: tatsächlich, ich habe vergessen: protobuf-net erweiterbare Objekte nicht unterstützt, aber Sie müssen ein wenig vorsichtig sein ... es auf den vollen Kontext abhängen würde, erwarte ich,

.

Plus Jon Ansatz von verschachtelten Daten würde auch wahrscheinlich funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top