Как разобрать данные строки MICR? - PullRequest
5 голосов
/ 24 сентября 2010

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

Некоторые компании, которые я пробовал, это Inlite Research Inc и Accusoft Pegasus.API от Inlite Research работает для некоторых банков, но не может правильно читать чеки Банка Америки.Я все еще тестирую API от Accusoft.

Я спрашиваю, знает ли кто-нибудь API, который будет точно анализировать строку MICR для различных компонентов.Есть ли API, который позволит мне добавить новые определения формата проверки, если я столкнусь с новой проверкой, что API не может обрабатывать правильно?Или, если кто-то знает, как написать или написал процедуру для анализа строки MICR.

Буду признателен за любую помощь, которую смогу получить.Спасибо.

Ответы [ 4 ]

3 голосов
/ 07 октября 2010

Извините за поздний ответ. Я не видел ответов на этот вопрос, поэтому думал, что никто не ответил.

Чтобы ответить на поставленные выше вопросы, я нашел решение, обдумав проблему и поговорив с различными поставщиками. Сканер Check, который я использую, уже может прочитать строку MICR. Проблема заключается в анализе строки MICR для получения соответствующей информации, такой как номер транзитного маршрута, номер счета, номер чека / серийный номер и сумма (если она есть). Поговорив с несколькими сторонними компаниями и опробовав доступные пробные версии парсера MICR, я пришел к выводу, что универсального парсера не существует. Я все еще сталкиваюсь с проблемой несоответствующего поля On-Us. Каждый банк форматирует это поле по-своему. Иногда символы расположены по-разному. Итак, я решил написать свой собственный парсер. Я думаю, что это наиболее логичный способ продолжить, так как эти сторонние поставщики сообщили мне, что каждый из них выпускает свое собственное программное обеспечение для анализа.

То, как я написал парсер, я вел таблицу шаблонов линий MICR. Каждый раз, когда я сталкиваюсь с новым форматом строки MICR, я буду обновлять эту таблицу. Мой анализатор сопоставит все проверки, отсканированные с этой таблицей, и, если найдет совпадение, он будет использовать этот шаблон для анализа соответствующей информации.

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

Спасибо всем, кто откликнулся и удачи.

1 голос
/ 13 июля 2016

Базовая модель MICR:

xxxxxxxxxxx / rrrrrrrrr / ooooooooooo baaaaaaaaaab

, где 'x' - это AuxOnUs, 'r' - это номер маршрута, 'o' - это OnUs, а 'a' - это сумма, а 'b' и '/' - специальные символы MICR.

Минимальная линия MICR:

/ rrrrrrrrr / ooooooooo

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

Маршрутный номер всегда соответствует, это единственная часть MICR, которая является универсальной.

Сумма обычно не кодируется в MICR, но иногда это так.

OnUs - сложная часть. Обычно он состоит из серийного номера чека и счета, но каждый банк обрабатывает его по-своему. Обычно серийный номер будет состоять из 4 цифр, но может быть 5 и более. Если есть поле AuxOnUs, вы можете быть уверены, что OnUs - это просто номер счета.

OnU могут содержать пробелы и тире. Было бы хорошо, если бы существовал согласованный способ их разделения, но я видел так много вариантов, я думаю, что лучше просто оставить его как поле «OnUs», а не разделять его на серийный номер и учетную запись, если только вы не банк-плательщик, в этом случае вы должны знать, в каком формате ваши чеки.

0 голосов
/ 26 октября 2016

6 лет после того, как этот вопрос был задан изначально, и я сталкивался с этим вопросом много раз за последние 2 недели.Я наконец нашел АКТУАЛЬНОЕ решение, и как правильно разобрать строку MICR.Я написал некоторый код для этого, и он работает на 99,9% проверок, которые я сканировал до сих пор, поэтому я должен поделиться и убедиться, что люди понимают, как это должно быть сделано.

В течение 11 лет ясделали эту работу.Мы всегда использовали чековые сканеры Magtek.Недавно я решил перейти на сканер изображений, чтобы мы могли сканировать все наши чеки.Я пошел с чеками Panini.К сожалению, их API не разделяет линию MICR, но наши сканеры Magtek были программируемыми, чтобы дать нам все, что мы хотели.Я создал базовую строку, которую можно сопоставить с шаблоном каждый раз.Это всегда будет выглядеть так:где a - номер маршрута, b - номер счета, а c - номер чека.Снова и снова я удивляюсь, как сканер, простое последовательное устройство, может понять это и сделать это КАЖДЫЙ ОДИН РАЗ в течение десятилетия.

Я начал с использования собственного ответа Патрика, своего рода, для построениятаблица моделей MICR, которых я раньше не видел.Проблема в том, что я побежал к точке, в которой один паттерн получал бы близкое совпадение с другим, и данные слегка отклонялись.Затем я попытался сделать это на основе номера маршрута, пока не наткнулся на две проверки от BofA, которые имели одинаковые номера маршрутов и совершенно разные линии MICR.Я был настолько разочарован, что мое лицо встретило мой стол в отчаянии.

После гораздо большего количества исследований, правильный путь - разбор строки MICR слева направо.Линии MICR расположены слева направо, и, конечно, поле, доставляющее нам больше всего хлопот, - это поле для нас.Все мои примеры фрагментов кода на C #.

Начните с цикла по строке в обратном порядке:

for (int i = micr.Length - 1; i >= 0; i--)

Оцените каждый символ во время цикла.Если ваш первый символ - это сумма, это бизнес-чек.Читайте, пока не получите другой символ суммы, затем сохраните это значение.Если следующим символом является символ «на нас», предположим, что контрольный номер находится слева от поля «на нас».Если следующим символом является цифра, продолжайте чтение и заполняйте буфер (ПОМНИТЕ, ЧТО ВЫ РАБОТАЕТЕ НАЗАД!) Цифрами, пока не достигнете действующего символа.Если ваш буфер содержит только цифры, это ваш номер чека.Если он пуст, просто двигайтесь дальше и собирайте все поле on-us в буфере, пока не достигнете транзитного символа.Как только вы достигнете транзитного символа, продолжайте читать и заполнять свой буфер, пока не дойдете до следующего транзитного символа.Ваш буфер теперь ваш номер маршрута.Если это проверка бизнеса, у вас все еще есть другие символы для чтения.Продолжайте читать, пока не достигнете ДРУГОГО нас-персонажа.Вы достигли вспомогательного поля on-us, которое должно быть номером чека.Читайте, пока не дойдете до следующего персонажа на нас, и это должно быть концом вашей строки.Теперь у вас есть номер чека.

Теперь посмотрите на значение, которое вы удалили из обычного поля on-us.Если у вас есть номер чека, то это номер вашего счета.Если у вас нет контрольного номера, то вы должны разделить поле «on-us» на пробелы и предположить, что ваш крайний левый набор (элемент массива 0) цифр является вашим контрольным номером.ОДНАКО, если после разделения по пробелам у вас есть только ОДИН элемент в массиве, это означает, что поле on-us, скорее всего, содержит тире, разделяющие элементы.Разделите поле on-us штрихами и предположите, что ваш крайний левый элемент массива - это номер чека, а остальные - номер вашего счета.Я видел некоторые, которые имеют до 3 штрихов в поле on-us, например: nnnn-1234-56-7, где nnnn - номер чека, а остальные - номер счета.

После того как номер вашего счета отделен от номера чека, удалите с него все разные символы (пробелы, тире и т. Д.).

Это мое решение всех моих проблем с MICR.Надеюсь, это поможет кому-то еще.

Спасибо, частично, этому документу: http://www.transact -tech.com / uploads / printers / files / 100-9094-Rev-C-MICR-Programmers-Guide.pdf

0 голосов
/ 13 июля 2016

Это должен быть правильный ответ, основываясь на моих исследованиях. Шаблоны MICR слишком разнообразны, чтобы надежно анализировать, не имея набора шаблонов сопоставления регулярных выражений для извлечения соответствующей информации. Было бы неплохо увидеть коллекцию шаблонов регулярных выражений, которые вы придумали с именами групп, такими как:

<(?<checkNumber>[0-9\s]*)<[0-9\s]*:[0-9\s]*:.*
...