Можете ли вы представить данные CSV в формате буфера протокола Google?
-
21-08-2019 - |
Вопрос
Недавно я узнал о буферах протокола, и мне было интересно, можно ли их применить к моей конкретной проблеме.
В принципе, у меня есть некоторые 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 поддерживает расширяемые объекты, но вам нужно быть немного осторожным...я полагаю, это будет зависеть от полного контекста.
Плюс подход Джона к вложенным данным, вероятно, тоже сработал бы.