2008-12-16 13 views
5

Niedawno dowiedziałem się o buforach protokołu i zastanawiałem się, czy można je zastosować do mojego konkretnego problemu.Czy możesz reprezentować dane CSV w formacie bufora protokołu Google?

Zasadniczo mam pewne dane CSV, które muszę przekonwertować na bardziej kompaktowy format do przechowywania, ponieważ niektóre pliki mają kilka gig.

Każde pole w pliku CSV ma nagłówek, a istnieją tylko dwa typy, ciągi znaków i znaki dziesiętne (ponieważ czasami jest wiele znaczących cyfr i muszę obsługiwać wszystkie numery w ten sam sposób). Ale każdy plik będzie miał różne nazwy kolumn dla każdego pola.

Oprócz przechwytywania oryginalnych danych CSV, muszę mieć możliwość dodania dodatkowych informacji do pliku przed zapisaniem. Miałem nadzieję, że zrobię to w przyszłości, posługując się różnymi wersjami plików.

Czy możliwe jest wykorzystanie buforów protokołów do przechwycenia losowej liczby losowo nazwanych kolumn danych, takich jak plik CSV?

Odpowiedz

3

Cóż, jest to z pewnością reprezentatywne. Coś jak:

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

Nie jestem pewien, jak wiele korzyści zapewni, pamiętajcie ... Można oczywiście dodać więcej informacji (dodaj do wiadomości CsvFile) oraz przyszłą proofing jest w sposób „normalny PB "- dodawaj tylko opcjonalne pola, itp.

+0

Tak, czytanie o kodowaniu PB nie napełniało mnie nadzieją, ponieważ moje dane to głównie gęste liczby. Nadal zrobię to i zobaczę, co się stanie. –

+0

Jeśli interesuje Cię System.Decimal Przedstawienia w PB, który prawdopodobnie zasługuje na osobne pytanie - lub post na grupie dyskusyjnej PB. Marc i ja rozmawialiśmy o tym wcześniej (i mogliby zrobić więcej wieczorem - Marc?). –

+0

@Jon - całkiem prawdopodobnie ;-p –

1

Cóż, protobuf-net (moja wersja) jest oparty na zwykłych typach .NET, więc nie (ponieważ nie radzi sobie z różnymi schematami przez cały czas). Ale wersja Jona może zezwalać na typy dynamiczne. Osobiście użyłbym po prostu CSV i uruchomiłbym go przez GZipStream - oczekuję, że wszystko będzie dobrze.


Edycja: faktycznie, zapomniałem: protobuf-net nie obsługuje rozszerzalne obiektów, ale trzeba być nieco ostrożny ... to zależy od pełnego kontekstu, spodziewam.

Również podejście Jona do zagnieżdżonych danych prawdopodobnie też by działało.

+0

Niestety, nie jestem pewien, czy jasno to wyjaśniłem - Dodaję również dodatkowe dane do pliku CSV, czasami jako dodatkowe kolumny, a czasem jako dane nagłówka lub stopki. Te dane chciałbym potwierdzić wersją. Dlatego myślałem o innych metodach przechowywania. –