Domanda

Ho di recente scoperto che il protocollo di buffer e mi chiedevo se potessero essere applicati per il mio problema specifico.

In pratica ho alcuni dati CSV che ho bisogno di convertire in un formato più compatto per la conservazione come alcuni dei file sono diversi giga.

Ogni campo nella CSV ha un'intestazione, e ci sono solo due tipi di stringhe e numeri decimali (perché a volte ci sono un sacco di cifre significative e ho bisogno di gestire tutti i numeri allo stesso modo).Ma ogni file avrà diversi nomi di colonna per ogni campo.

Così come catturare l'originale CSV i dati di cui ho bisogno per essere in grado di aggiungere informazioni al file prima di salvare.E speravo di fare questa prova di futuro, mediante la gestione di diverse versioni dei file.

Così, è possibile utilizzare un buffer di protocollo per la cattura di un numero casuale di nome casuale colonne di dati, come file CSV?

È stato utile?

Soluzione

Beh, è sicuramente rappresentabile.Qualcosa di simile a:

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)
}

Io non sono sicuro di quanto beneficio fornirà, intendiamoci...Si può certamente aggiungere ulteriori informazioni (aggiungere alla CsvFile messaggio) e a prova di futuro è nel "normale PB modo" - solo aggiungere campi facoltativi, etc.

Altri suggerimenti

Bene, protobuf-net (la mia versione) si basa sui tipi .NET regolari, in modo che nessun (dal momento che non farà fronte con schemi diversi tutto il tempo). Ma la versione di Jon potrebbe consentire tipi dinamici. Personalmente, mi basta usare CSV ed eseguirlo tramite GZipStream -. Mi aspetto che andrà bene per lo scopo


Edit: in realtà, ho dimenticato: protobuf-net non supporta gli oggetti estensibili, ma è necessario essere un po 'attenti ... sarebbe dipenderà dal contesto completo, mi aspetto

.

Inoltre l'approccio di Jon dei dati annidati probabilmente funzionerebbe anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top