2008-12-16 34 views
5

我最近發現了有關協議緩衝區,並想知道它們是否可以應用於我的特定問題。你能用Google協議緩衝區格式表示CSV數據嗎?

基本上我有一些CSV數據,我需要轉換爲更緊湊的存儲格式,因爲一些文件是幾個演出。

CSV中的每個字段都有一個標題,並且只有兩種類型,字符串和小數(因爲有時候有很多有效數字,我需要以相同方式處理所有數字)。但是每個文件的每個字段都有不同的列名。

除了捕獲原始CSV數據,我還需要在保存之前向文件添加額外的信息。我希望通過處理不同的文件版本來做出這個未來的證明。

那麼,是否有可能使用協議緩衝區來捕獲隨機數字的隨機數列,如CSV文件?

回答

3

嗯,這當然是可以代表的。喜歡的東西:

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

我不知道有多少好處它會提供,你要知道...你當然可以添加更多的信息(添加到CsvFile消息)和適應未來發展是「正常PB方式「 - 僅添加可選字段等。

+0

是啊,閱讀關於PB的編碼並不能滿足我的希望,因爲我的數據主要是密集的數字。不過,我會試試看看會發生什麼。 – 2008-12-16 14:49:27

1

那麼,protobuf網(我的版本)是基於常規的.NET類型,所以不(因爲它不會應付不同的架構所有時間)。但是Jon的版本可能允許動態類型。就個人而言,我只是使用CSV並通過GZipStream運行它 - 我期望這樣做可以達到目的。


編輯:其實,我忘了:protobuf網不支持擴展的對象,但你需要小心一點......這要看完整的上下文,我的期望。

另外喬恩的嵌套數據的方法也可能工作。

+0

對不起,我不確定我是否清楚 - 我還將額外的數據添加到CSV,有時作爲額外的列,有時作爲頁眉或頁腳數據。這些數據我想要版本證明。這就是我考慮其他存儲方法的原因。 – 2008-12-16 14:42:04