Введение: у вас нет указанных фреймворков или библиотек, поэтому я полагаю, что вы будете кодировать все с нуля.
Первая идея, которая у меня есть, - создавать разные DTO для разных клиентов
Учитывая то, что вы написали, это означает, что вы уже знаете формат файла всех ваших клиентов.
Будут ли они меняться со временем?
Можете ли вы добавить новый класс, если появится новый клиент, или есликто-то меняет формат файла?
Если нет, это решение не применимо.
сохраняется в базе данных в единой форме
Это означает, что выиметь одну таблицу базы данных, в которой будут храниться эти данные.
Учитывая, что каждый файл имеет разные заголовки, вам необходимо подготовить таблицу таким образом, чтобы в ней были сохранены все возможные заголовки, или каким-либо образом отобразить их.
Затем необходимо инкапсулировать процесс чтения файла, его анализа и сохранения.
Мое предложение состоит в том, чтобы иметь правильный класс, который получает в качестве входных данных CSVFile
экземпляр.
Вот как я представляю поток кода
final File file = ...
// Program against interfaces
final Parser parser = new CsvParser(file);
final ParseResult result = parser.parse();
// Headers and Rows provide access to each field or row via getters
final Headers headers = result.getHeaders();
final Rows rows = result.getRows();
// Decorator pattern to apply headers mappings, to have a unified layout
final Headers mappedHeaders = new MappingHeaders(headers, mapping);
persistence.save(mappedHeaders, rows);
Для фазы синтаксического анализа простой, хотя и чистый, подход поддерживает каждую строку как Object[]
или String[]
массив (решите, хотите ли вы применять преобразования или нет).
Как вы знаете, CSV-файл имеет каждое поле, разделенное запятой (,
), что означает, что вам нужно
прочитать первую строку, разбить ее и сохранить полученный массив в виде заголовков / ключей массива.
headers = ["day", "time, "year", "name", "surname"]
прочитать вторую строку, разбить ее, сохранить в массиве, который будет иметь одинаковую длину заголовков, один
повтор для каждой последующей строки
Таким образом, каждый индекс массива соответствует определенному имени столбца, которое можно получить с помощью массива headers
.
Что ж, я дал вамобщее видениеТеперь все зависит от вас, поскольку вы знаете требования лучше, чем кто-либо другой.