Подходящая структура данных для обработки плоских файлов?
-
08-07-2019 - |
Вопрос
По сути, мне нужно поместить плоский файл в базу данных.В плоских файлах первые два символа в каждой строке указывают тип записи.
Создаю ли я класс для каждого типа записи со свойствами, соответствующими полям записи?Должен ли я просто использовать массивы?
Я хочу загрузить данные в какую-то структуру данных перед сохранением их в базе данных, чтобы можно было использовать модульные тесты для проверки правильности загрузки данных.
Вот пример того, с чем мне придется работать (выписки по счету BAI2):
01,121000358,CLIENT,050312,0213,1,80,1,2/
02,CLIENT-STANDARD,BOFAGB22,1,050311,2359,,/
03,600812345678,GBP,fab1,111319005,,V,050314,0000/
88,fab2,113781251,,V,050315,0000,fab3,113781251,,V,050316,0000/
88,fab4,113781251,,V,050317,0000,fab5,113781251,,V,050318,0000/
88,010,0,,,015,0,,,045,0,,,100,302982205,,,400,302982205,,/
16,169,57626223,V,050311,0000,102 0101857345,/
88,LLOYDS TSB BANK PL 779300 99129797
88,TRF/REF 6008ABS12300015439
88,102 0101857345 K BANK GIRO CREDIT
88,/IVD-11 MAR
49,1778372829,90/
98,1778372839,1,91/
99,1778372839,1,92
Решение
Я бы порекомендовал создавать классы (или структуры, или любой тип значения, поддерживаемый вашим языком), как
record.ClientReference
гораздо более наглядно, чем
record[0]
и, если вы используете (замечательно!) библиотеку FileHelpers , то ваши условия довольно многое для вас продиктовано.
Другие советы
Логика проверки обычно имеет как минимум два уровня: более грубый уровень — «хорошо отформатированный», а более тонкий — «правильные данные».
Здесь есть несколько отдельных проблем.Одна из проблем заключается в простой проверке данных или написании тестов, чтобы убедиться в точности вашего анализа.Простой способ сделать это - разобраться в классе, который принимает заданный диапазон значений, и бросает соответствующую ошибку, если нет, например,
public void setField1(int i) { if (i>100) выдает new InvalidDataException...}
Создание разных классов для каждого типа записи — это то, что вам может понадобиться, если логика синтаксического анализа существенно различается для разных кодов, поэтому у вас нет условной логики, такой как
public void setField2(String s)
{
if (field1==88 && s.equals ...
else if (field2==22 && s
}
дааа.
Когда мне приходилось загружать данные такого рода в прошлом, я помещал их все в рабочую таблицу с первыми двумя символами в одном поле, а остальные - в другом. Затем я разобрал его в соответствующих других рабочих таблицах на основе первых двух символов. Затем я произвел очистку и проверку перед вставкой данных из второго набора рабочих таблиц в базу данных. Р>
В SQL Server вы можете сделать это с помощью пакета DTS (2000) или служб SSIS. Используя SSIS, вы сможете обрабатывать данные на лету, сначала сохраняя их в рабочих таблицах, но процесс печати будет нелепым, используйте первый. два символа для определения используемой ветви потока данных, затем анализируют оставшуюся часть записи в некотором типе механизма хранения, а затем очищают и проверяют перед вставкой. Я уверен, что другие базы данных также имеют некоторый тип механизма для импорта данных и будут использовать аналогичный процесс.
Я согласен с тем, что если ваш формат данных имеет какую-либо сложность, вам следует создать набор пользовательских классов для анализа и хранения данных, выполнения проверки и выполнения любых других соответствующих задач модели (например, вернуть описание, читаемое человеком, хотя некоторые утверждали бы, что это было бы лучше поместить в отдельный класс представления). Вероятно, это было бы хорошей ситуацией для использования наследования, когда у вас есть родительский класс (возможно, абстрактный), определяющий свойства и методы, общие для всех типов записей, и каждый дочерний класс может переопределять эти методы, чтобы обеспечить их собственный анализ и проверку при необходимости. или добавьте свои собственные свойства и методы.
Создание класса для каждого типа строки было бы лучшим решением, чем использование массивов.
Тем не менее, в прошлом я использовал Arraylists of Hashtables для достижения того же. Каждый элемент массива представляет собой строку, а каждая запись в хеш-таблице представляет собой пару ключ / значение, представляющую имя столбца и значение ячейки.
Почему бы не начать с разработки базы данных, в которой будут храниться данные, тогда вы можете использовать создание сущностей для создания классов для вас.
вот дурацкая идея:
если бы вы работали в Perl, вы могли бы использовать ДБД::CSV для чтения данных из вашего плоского файла при условии, что вы указали правильные значения разделителей и символов EOL.затем вы читали строки из плоского файла с помощью операторов SQL;DBI преобразует их в стандартные структуры данных Perl, и вы можете запускать любую логику проверки, которая вам нравится.как только каждая строка пройдет все проверочные тесты, вы сможете записать ее в целевую базу данных с помощью DBD::whatever.
-Стив