Pergunta

Eu encontrei recentemente para fora sobre buffers de protocolo e queria saber se eles poderiam ser aplicados para o meu problema específico.

Basicamente, eu tenho alguns dados CSV que eu preciso para converter para um formato mais compacto para o armazenamento como alguns dos arquivos de vários show.

Cada campo no CSV tem um cabeçalho, e há apenas dois tipos, cordas e decimais (porque às vezes há um monte de dígitos significativos e eu preciso para lidar com todos os números da mesma forma). Mas cada arquivo terá diferentes nomes de coluna para cada campo.

Além de capturar os dados CSV originais que eu preciso ser capaz de adicionar informações extras para o arquivo antes de salvar. E eu estava esperando para fazer este futuro prova de lidar com diferentes versões de arquivo.

Assim, é possível a utilização de buffers de protocolo para capturar um número aleatório de colunas nomeadas aleatoriamente de dados, como um arquivo CSV?

Foi útil?

Solução

Bem, certamente é representável. Algo 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)
}

Eu não tenho certeza quanto benefício que irá fornecer, você mente ... Você certamente pode adicionar mais informação (adicionar à mensagem CsvFile) e os ensaios futuros está na "forma normal PB" - só adicionar campos opcionais, etc.

Outras dicas

Bem, protobuf-net (minha versão) é baseado em tipos regulares .NET, de modo nenhum (uma vez que não vai lidar com esquemas diferentes o tempo todo). Mas a versão de Jon pode permitir que tipos dinâmicos. Pessoalmente, eu só uso CSV e executá-lo através GZipStream -. Espero que vai ficar bem com a finalidade


Edit: na verdade, eu esqueci: protobuf-net suporta objetos extensíveis, mas você precisa ser um pouco cuidadoso ... seria dependem do contexto completo, espero

.

abordagem de dados aninhados de Além disso Jon provavelmente funcionaria também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top