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