Можете ли вы представить данные CSV в формате буфера протокола Google? - PullRequest
5 голосов
/ 16 декабря 2008

Я недавно узнал о буферах протоколов и задавался вопросом, могут ли они быть применены к моей конкретной проблеме.

В основном у меня есть некоторые CSV-данные, которые мне нужно преобразовать в более компактный формат для хранения, так как некоторые файлы имеют несколько гигабайт.

У каждого поля в CSV есть заголовок, и есть только два типа, строки и десятичные числа (потому что иногда есть много значащих цифр, и мне нужно обрабатывать все числа одинаково). Но каждый файл будет иметь разные имена столбцов для каждого поля.

Помимо сбора исходных данных CSV, мне нужно иметь возможность добавить дополнительную информацию в файл перед сохранением. И я надеялся сделать это в будущем, обрабатывая разные версии файлов.

Итак, возможно ли использовать буферы протокола для захвата случайного числа столбцов данных со случайным именем, например, файла CSV?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2008

Ну, это, конечно, представительно. Что-то вроде:

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 голос
/ 16 декабря 2008

Ну, protobuf-net (моя версия) основан на обычных типах .NET, так что нет (так как он не будет постоянно работать с разными схемами). Но версия Джона может разрешать динамические типы. Лично я бы просто использовал CSV и запускал его через GZipStream - я ожидаю, что это подойдет для этой цели.


Редактировать: на самом деле, я забыл: protobuf-net поддерживает расширяемые объекты, но вы должны быть немного осторожнее ... я думаю, это будет зависеть от полного контекста.

Плюс подход Джона к вложенным данным, вероятно, тоже сработает.

...