Подходящая структура данных для обработки плоских файлов? - PullRequest
3 голосов
/ 20 ноября 2008

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

Создать ли класс для каждого типа записи со свойствами, соответствующими полям в записи? Должен ли я просто использовать массивы?

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

Вот пример того, с чем мне приходится работать (выписка из банка 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

Ответы [ 7 ]

1 голос
/ 20 ноября 2008

Логика валидации обычно имеет как минимум 2 уровня, при этом грубый уровень «хорошо отформатирован», а более тонкий уровень - «правильные данные».

Здесь есть несколько отдельных проблем. Одна из проблем заключается в простой проверке данных или написании тестов для проверки точности анализа. Простой способ сделать это - проанализировать класс, который принимает заданный диапазон значений и выдает соответствующую ошибку, если нет, например

public void setField1 (int i) { если (i> 100) выбрасывает новое InvalidDataException ... }

Создание разных классов для каждого типа записи - это то, что вам может понадобиться, если логика синтаксического анализа значительно отличается для разных кодов, поэтому у вас нет условной логики, такой как

   public void setField2(String s)
   {
         if (field1==88 && s.equals ...

         else if (field2==22 && s 
   }

yechh.

1 голос
/ 20 ноября 2008

Я бы рекомендовал создать классы (или структуры, или любой тип значения, поддерживаемый вашим языком), как

record.ClientReference

гораздо более наглядно, чем

record[0]

и, если вы используете (замечательно!) FileHelpers Library , то ваши условия в значительной степени продиктованы вами.

0 голосов
/ 20 ноября 2008

вот дурацкая идея:

если вы работали в Perl, вы могли бы использовать DBD :: CSV для чтения данных из вашего плоского файла, при условии, что вы дали ему правильные значения для символов-разделителей и EOL. затем вы читаете строки из плоского файла с помощью операторов SQL; DBI превратит их в стандартные структуры данных Perl для вас, и вы сможете запустить любую логику валидации, которая вам нравится. как только каждая строка пройдет все проверочные тесты, вы сможете записать ее в целевую базу данных, используя DBD :: любой другой тип.

-Стив

0 голосов
/ 20 ноября 2008

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

0 голосов
/ 20 ноября 2008

Создание класса для каждого типа строк будет лучшим решением, чем использование массивов.

Тем не менее, в прошлом я использовал Arraylists of Hashtables для достижения того же. Каждый элемент массива представляет собой строку, а каждая запись в хеш-таблице представляет собой пару ключ / значение, представляющую имя столбца и значение ячейки.

0 голосов
/ 20 ноября 2008

Я согласен с тем, что если ваш формат данных имеет какую-либо сложность, вы должны создать набор пользовательских классов для анализа и хранения данных, выполнения проверки и выполнения любых других соответствующих задач модели (например, вернуть описание, читаемое человеком, хотя некоторые утверждали бы, что это было бы лучше поместить в отдельный класс представления). Вероятно, это было бы хорошей ситуацией для использования наследования, когда у вас есть родительский класс (возможно, абстрактный), определяющий свойства и методы, общие для всех типов записей, и каждый дочерний класс может переопределять эти методы для обеспечения своего собственного анализа и проверки при необходимости или добавьте свои собственные свойства и методы.

0 голосов
/ 20 ноября 2008

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

В SQL Server вы можете сделать это через DTS (2000) или пакет служб SSIS. Используя SSIS, вы сможете обрабатывать данные «на лету», сначала сохраняя их в рабочих таблицах, но процесс печати будет нелепым, используйте первый. два символа для определения используемой ветви потока данных, затем анализируют оставшуюся часть записи в некотором типе механизма хранения, а затем очищают и проверяют перед вставкой. Я уверен, что другие базы данных также имеют некоторый тип механизма для импорта данных и используют аналогичный процесс.

...