5

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

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

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

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

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

4

2 回答 2

5

嗯,它当然是有代表性的。就像是:

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

于 2008-12-16T14:38:07.373 回答
1

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


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

另外,Jon 的嵌套数据方法也可能会奏效。

于 2008-12-16T14:32:19.147 回答