您能用Google的协议缓冲区格式表示CSV数据吗?

时间:2008-12-16 14:15:04

标签: c# serialization csv protocol-buffers

我最近发现了协议缓冲区,并想知道它们是否可以应用于我的具体问题。

基本上我有一些CSV数据需要转换为更紧凑的存储格式,因为有些文件是几个gig。

CSV中的每个字段都有一个标题,只有两种类型,字符串和小数(因为有时会有很多有效数字,我需要以相同的方式处理所有数字)。但是每个文件的每个字段都有不同的列名。

除了捕获原始CSV数据外,我还需要在保存之前向文件中添加额外信息。我希望通过处理不同的文件版本来证明这一点。

那么,是否可以使用协议缓冲区来捕获随机数量的随机命名数据列,如CSV文件?

2 个答案:

答案 0 :(得分:4)

嗯,这肯定是可以表达的。类似的东西:

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方式” - 只添加可选字段,等

答案 1 :(得分:1)

嗯,protobuf-net(我的版本)基于常规的.NET类型,所以没有(因为它不会一直处理不同的模式)。但Jon的版本可能允许动态类型。就个人而言,我只是使用CSV并通过GZipStream运行它 - 我希望这样可以达到目的。


编辑:实际上,我忘记了:protobuf-net确实支持可扩展对象,但是你需要小心一点......我希望它取决于完整的上下文。

加上Jon的嵌套数据方法也可能有用。