我有一个数字检查扫描仪,能够从检查中捕获MICR线。它将原始格式的MICR行作为字符串返回,并使用分隔符分隔帐号,路由号和支票号。但是,每个银行以不同方式格式化此MICR行,因此没有标准方法来解析此数据。
我尝试过的一些公司是Inlite Research Inc和Accusoft Pegasus。 Inlite Research的API适用于某些银行,但无法正确阅读美国银行支票。我还在测试Accusoft的API。
我要问的是,是否有人知道将准确解析不同组件的MICR行的API。是否有一个API,如果我遇到API无法正确处理的新检查,我会添加检查格式的新定义?或者,如果有人知道如何编写例程或编写解析MICR行的例程。
我很感激我能得到的任何帮助。谢谢。
答案 0 :(得分:3)
很抱歉迟到的回复。我没有看到任何问题的答案,所以我认为没有人回应。
为了回答上述问题,我在考虑了问题并与各个供应商交谈后找到了解决方案。我正在使用的Check扫描仪已经能够读取MICR线。问题在于解析MICR线路以获取相关信息,例如路由转接号码,帐号,支票/序列号和金额(如果有)。在与少数第三方公司交谈并尝试可用的MICR解析器试用版之后,我得出结论,那里没有通用的解析器。我仍然面临着不合格的On-Us领域的问题。每个银行都以不同的方式格式化有时,符号的排列方式也不同。所以,我决定编写自己的解析器。我认为这是最合乎逻辑的方式,因为我被这些第三方供应商告知他们每个人都推出自己的解析软件。
我编写解析器的方式是我保留了MICR线条模式表。每次遇到新的MICR线路格式时,我都会更新此表格。我的解析器将匹配针对此表扫描的任何检查,如果找到匹配,它将使用该模式来解析相关信息。
我希望我的经验和我提出的解决方案也能帮助那些遇到同样问题的人。
感谢所有回复并祝你好运的人。
答案 1 :(得分:1)
MICR的基本模式:
xxxxxxxxxxx / rrrrrrrrr / ooooooooooo baaaaaaaaaab
其中'x'是AuxOnUs,'r'是路由号,'o'是OnUs,'a'是金额,'b'和'/'是特殊的MICR符号。
最小的MICR线只是:
/ rrrrrrrrr / ooooooooo
AuxOnUs通常仅用于业务检查,它几乎总是意味着有一个序列号。
路由号码始终是一致的,它是MICR唯一普遍的部分。
金额通常不在MICR中编码,但有时也是。
OnUs是棘手的部分。它通常由支票序列号和帐户组成,但每个银行以不同方式处理它。通常序列号为4位数,但可能为5位或更多。如果有AuxOnUs字段,您可以非常确定OnUs只是帐号。
OnUs可以包含空格和短划线。如果有一致的方式划分它会很好,但我看到了很多变化,我认为最好将它留作“OnUs”字段,而不是将其分成串行和帐户,除非你是支付银行,在这种情况下,您应该知道自己的支票是什么格式。
答案 2 :(得分:0)
根据我的研究,这应该是正确的答案。 MICR模式变化太大,无法可靠地解析而没有正则表达式匹配模式的集合来提取相关信息。更好的是看到你用组名来提出正则表达式模式的集合,如:
<(?<checkNumber>[0-9\s]*)<[0-9\s]*:[0-9\s]*:.*
答案 3 :(得分:-1)
最初问这个问题6年后,我在过去两周内多次遇到过这个问题。我终于找到了一个ACTUAL解决方案,以及如何正确解析MICR系列。我已经编写了一些代码来执行此操作,并且它对我迄今为止已经扫描过的99.9%的检查有效,因此我必须分享并确保人们了解应该如何完成此操作。
11年来,我完成了这项工作。我们一直使用Magtek检查扫描仪。最近我决定转移到成像扫描仪,以便我们可以扫描所有检查。我选择了Panini检查扫描仪。不幸的是,他们的API并没有打破MICR系列,但我们的Magtek扫描仪是可编程的,可以为我们提供我们想要的任何东西。我创建了一个基本字符串,每次都可以与模式匹配。它总是出现:&lt; aaaaaaaa / bbbbbbbb / ccc&gt;其中a是路由号码,b是帐号,c是支票号码。一遍又一遍,我一直想知道扫描仪,只是一个简单的串行设备,如何能够解决这个问题,并且每隔一段时间才能正确使用它十年。
我开始使用帕特里克自己的答案,建立一个我以前从未见过的MICR模式表。问题是我跑到了一个模式与另一个检查紧密匹配的点,数据会稍微偏离。然后,我尝试根据路线编号进行操作,直到我遇到来自美国银行的两张检查路线编号相同且MICR线路完全不同的检查。我很失望,我的脸很沮丧地碰到了我的桌子。
经过更多的研究,正确的方法是从左到右解析MICR线。 MICR线是从左到右,当然,给我们带来最多麻烦的领域是on-us领域。我的所有示例代码段都是C#代码。
首先向后循环字符串:
for (int i = micr.Length - 1; i >= 0; i--)
循环时评估每个字符。如果您的第一个字符是金额字符,那么它就是业务检查。阅读,直到你得到另一个金额字符,然后保存该值。如果下一个字符是on-us符号,则假设支票号位于on-us字段的最左侧。如果下一个字符是一个数字,请继续阅读并填充一个缓冲区(请记住你正在向后工作!),直到你到达我们的角色。如果您的缓冲区仅包含数字,则表示您的支票号码。如果它是空的,只需继续并在缓冲区中收集整个on-us字段,直到到达传输字符。到达过境角色后,请继续阅读并填充缓冲区,直至到达下一个过境角色。您的缓冲区现在是您的路由号码。如果是业务检查,您仍然需要阅读更多字符。继续阅读,直到你达到另一个我们的角色。您现在已到达辅助的on-us字段,该字段应为支票号码。阅读,直到你到达下一个我们的角色,这应该是你的字符串的结尾。你现在有了支票号码。
现在,查看从常规on-us字段中删除的值。如果您有支票号码,那就是您的帐号。如果你没有支票号码,那么你应该用空格分割on-us字段,并假设你的最左边的数字(数组元素0)是你的支票号码。但是,如果按空格分割后,数组中只有一个元素,这意味着on-us字段可能包含分隔项目的破折号。用破折号拆分on-us字段,并假设你的最左边的数组元素是支票号,其余的是你的帐号。我已经看到一些在on-us字段中有多达3个短划线的内容,如下所示:nnnn-1234-56-7,其中nnnn是支票号,其余是帐号。
将您的帐号与支票号分开后,从中删除任何杂项字符(空格,破折号等),您就完成了。
这是我解决所有MICR问题的方法。希望它可以帮助别人。
部分感谢此文档:http://www.transact-tech.com/uploads/printers/files/100-9094-Rev-C-MICR-Programmers-Guide.pdf