Можете ли вы представить данные CSV в формате буфера протокола Google?

StackOverflow https://stackoverflow.com/questions/371418

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Что ж, это, безусловно, представимо.Что - то вроде:

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" - добавляются только необязательные поля и т.д.

Другие советы

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


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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top