você pode representar dados CSV em formato de buffer de protocolo do Google?
-
21-08-2019 - |
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?
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.