5

我有一个数字支票扫描仪,它能够从支票中捕获 MICR 行。它将以原始格式作为字符串返回 MICR 行,并使用分隔符分隔帐号、路由号码和支票号码。但是,每家银行都以不同的方式格式化此 MICR 行,因此没有标准的方法来解析此数据。

我尝试过的一些公司是 Inlite Research Inc 和 Accusoft Pegasus。Inlite Research 的 API 适用于某些银行,但无法正确读取美国银行的支票。我仍在测试来自 Accusoft 的 API。

我要问的是,是否有人知道可以准确解析不同组件的 MICR 行的 API。如果我遇到 API 无法正确处理的新检查,是否有 API 可以让我添加检查格式的新定义?或者,如果有人知道如何或已经编写了一个例程来解析 MICR 行。

我会很感激我能得到的任何帮助。谢谢你。

4

4 回答 4

3

这么晚才回复很抱歉。我没有看到这个问题的任何答案,所以我认为没有人回答。

为了回答上面的问题,我在思考问题并与各个供应商交谈后找到了解决方案。我正在使用的检查扫描仪已经能够读取 MICR 行。问题在于解析 MICR 行以获取相关信息,例如路由中转号码、帐号、支票/序列号和金额(如果有)。在与少数 3rd 方公司交谈并试用了 MICR 解析器的可用试用版后,我得出的结论是没有通用解析器。我仍然面临着 On-Us 领域不合格的问题。每个银行都以不同的方式格式化该字段。有时符号的排列方式也不同。所以,我决定编写自己的解析器。我认为这是最合乎逻辑的方式,因为我

我编写解析器的方式是保存一张 MICR 线条模式表。每次遇到新的 MICR 行格式时,我都会更新此表。我的解析器将匹配针对此表扫描的任何检查,如果找到匹配项,它将使用该模式来解析相关信息。

我希望我的经验和我提出的解决方案也能帮助那些遇到同样问题的人。

感谢所有回复的人,祝你好运。

于 2010-10-06T23:29:22.860 回答
0

根据我的研究,这也应该是正确的答案。MICR 模式变化多端,无法在没有正则表达式匹配模式集合来提取相关信息的情况下进行可靠解析。最好看到您想出的带有组名的正则表达式模式集合,例如:

<(?<checkNumber>[0-9\s]*)<[0-9\s]*:[0-9\s]*:.*
于 2016-07-12T23:05:17.990 回答
0

MICR的基本模式:

xxxxxxxxxxx /rrrrrrrrr/ oooooooooooo baaaaaaaaaab

其中“x”是 AuxOnUs,“r”是路由号码,“o”是 OnUs,“a”是数量,“b”和“/”是特殊的 MICR 符号。

一条最小的 MICR 线就是:

/rrrrrrrr/ooooooooo

AuxOnUs 通常只用于业务检查,它几乎总是意味着有一个序列号。

路由编号始终是一致的,它是 MICR 中唯一通用的部分。

金额通常不会在 MICR 中编码,但有时会。

OnUs 是棘手的部分。它通常由支票序列号和帐户组成,但每个银行的处理方式不同。通常序列号为 4 位,但也可能为 5 位或更多。如果有 AuxOnUs 字段,您可以确定 OnUs 只是帐号。

OnU 可以包含空格和破折号。如果有一致的划分方式会很好,但我已经看到了很多变化,我认为最好将其保留为“OnUs”字段而不是将其分成序列和帐户,除非你是付款银行,在这种情况下,您应该知道自己的支票是什么格式。

于 2016-07-12T23:23:35.703 回答
-1

在最初提出这个问题 6 年后,我在过去 2 周内多次遇到这个问题。我终于找到了一个实际的解决方案,以及如何正确解析 MICR 行。我为此编写了一些代码,它适用于我迄今为止扫描的 99.9% 的检查,所以我必须分享并确保人们理解应该如何完成。

11年来,我一直在做这项工作。我们一直使用 Magtek 支票扫描仪。最近我决定搬到成像扫描仪上,这样我们就可以扫描所有支票。我和帕尼尼支票扫描仪一起去了。不幸的是,他们的 API 并没有打破 MICR 线,但是我们的 Magtek 扫描仪是可编程的,可以给我们想要的任何东西。我创建了一个基本字符串,每次都可以与模式匹配。它总是会显示为: <aaaaaaaaa/bbbbbbbb/ccc> 其中 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 字符,这应该是你的字符串的结尾。您现在有了支票号码。

现在,查看您从常规 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

于 2016-10-25T22:26:53.223 回答