Разбор огромных данных с помощью c ++ - PullRequest
1 голос
/ 13 февраля 2009

В моей работе мне нужно анализировать файлы данных различного типа из разных источников данных. Иногда я анализирую их, написав непосредственно код на c ++ (с помощью qt и boost: D), иногда вручную с помощью вспомогательной программы. Я должен отметить, что типы данных настолько отличаются друг от друга, что трудно создать общий интерфейс для всех них. Но я хочу сделать эту работу более общим способом. Я планирую написать библиотеку для их преобразования, и в будущем должно быть легко добавить новую утилиту синтаксического анализа. Я также планирую использовать другие вспомогательные программы внутри моей программы, а не вручную. Мой вопрос заключается в том, какую архитектуру или шаблон вы предлагаете. Базовое условие - библиотека должна расширяться с помощью новых классов или библиотек DLL, а также настраиваться. Между прочим, данные могут быть в виде текста, ascii или что-то вроде CSV (значения, разделенные запятыми), и большинство из них относятся к определенным данным.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2009

Не трубить мою собственную трубу, но моя маленькая утилита с открытым исходным кодом CSVfix имеет расширяемую архитектуру, основанную на создании новых классов C ++ с очень простым интерфейсом. Я действительно рассматривал возможность использования архитектуры плагинов с DLL, но это казалось излишним для такой простой утилиты. Если вы заинтересованы, вы можете получить двоичные файлы и исходные коды здесь .

1 голос
/ 14 февраля 2009

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

  • Reader: в этом слое значения считываются из источника (т.е. CSV-файла) с использованием некоторого дескриптора формата файла. Значения затем сохраняются в некоторой промежуточной структуре данных.
  • Соединитель / Конвертер: Этот слой отвечает за сопоставление данных считывателя с полями записи.
  • Writer: этот слой отвечает за запись определенной структуры данных в цель (т. Е. Другой формат файла или базу данных).

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

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

0 голосов
/ 14 февраля 2009

Один метод, который я использовал для определения структуры данных в моих классах чтения / записи в файле данных, - это использование std::map<std::string, std::vector<std::string>, string_compare>, где ключ - это имя переменной, а вектор строк - данные. Хотя это дорого в памяти, это не ограничивает меня только числовыми данными. И этот метод допускает различную длину данных в одном и том же файле.

У меня был базовый класс, реализующий это общее хранилище, в то время как производные классы реализовали возможность чтения / записи. Затем я использовал фабрику, чтобы добраться до нужного обработчика, используя другой класс, который определил формат файла.

...