代码之家  ›  专栏  ›  技术社区  ›  Cameron MacFarland

你能用谷歌的协议缓冲区格式表示CSV数据吗?

  •  6
  • Cameron MacFarland  · 技术社区  · 17 年前

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

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

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

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

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

    2 回复  |  直到 17 年前
        1
  •  5
  •   Jon Skeet    17 年前

    嗯,这当然是可以代表的。类似于:

    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方式”进行未来验证,只添加可选字段等。

        2
  •  1
  •   Marc Gravell    17 年前

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


    编辑:实际上,我忘了:protobuf-net确实支持可扩展对象,但你需要小心一点。..我想这取决于整个背景。

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