2008-12-16 11 views
5

Hace poco descubrí los búferes de protocolo y me preguntaba si podrían aplicarse a mi problema específico.¿Puede usted representar los datos CSV en el formato Buffer de Protocolo de Google?

Básicamente tengo algunos datos CSV que necesito para convertir a un formato más compacto para el almacenamiento ya que algunos de los archivos de varias concierto.

Cada campo en el archivo CSV tiene un encabezado, y solo hay dos tipos, cadenas y decimales (porque a veces hay muchos dígitos significativos y necesito manejar todos los números de la misma manera). Pero cada archivo tendrá diferentes nombres de columna para cada campo.

Además de la captura de los datos CSV original, tengo que ser capaz de añadir información adicional al archivo antes de guardar. Y esperaba hacer esta prueba a futuro manejando diferentes versiones de archivos.

Por lo tanto, es posible el uso de búferes de protocolo para capturar un número aleatorio de columnas llamadas al azar de los datos, como un archivo CSV?

Respuesta

3

Bueno, ciertamente es representable. Algo así como:

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

No estoy seguro de cuánto beneficio que proporcionará, eso sí ... Por supuesto que puede añadir más información (añadir al mensaje CsvFile) y las pruebas futuro está en el "camino de PB normales "- solamente agregar campos opcionales, etc.

+0

Si, leer sobre la codificación de PB no me llenó de esperanza ya que mis datos son principalmente números densos. Aún así lo intentaré y veré qué pasa. –

+0

Si le interesan las representaciones de System.Decimal en PB, probablemente merezca una pregunta por separado, o una publicación en el grupo de discusión de PB. Marc y yo hemos discutido esto antes (y podríamos hacer más esta noche, ¿Marc?). –

+0

@Jon - muy probablemente ;-p –

1

Bueno, protobuf-net (mi versión) se basa en los tipos de .NET regulares, por lo que no (ya que no va a hacer frente a los diferentes esquemas todo el tiempo). Pero la versión de Jon podría permitir tipos dinámicos. Personalmente, solo usaría CSV y lo ejecutaría a través de GZipStream. Espero que esté bien para el propósito.


Editar: en realidad, se me olvidó: protobuf-net es compatible con objetos extensibles, pero hay que ser un poco cuidadoso ... que dependerá del contexto completo, espero. enfoque de los datos anidadas de

Plus Jon probablemente funcionaría también.

+0

lo sentimos, no estoy seguro si me dejó en claro - yo también estoy añadiendo datos adicionales a la CSV, a veces como columnas adicionales y algunas veces como datos de cabecera o pie de página. Esta información me gustaría probar la versión. Es por eso que estaba pensando en otros métodos de almacenamiento. –

Cuestiones relacionadas