Подходящая структура данных для обработки плоских файлов?

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

  •  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.

-Стив

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