从存储的文本字符串中识别可能的条形码符号的方法?

问题描述

问题:

是否有一种方法[1]或最佳实践(s)可以在扫描发生后确定哪些条码符号对特定数据有效?

~ (无法访问图像或硬件;只有一个字符串或数据库字段可用,没有相关元数据)


讨论:

由于相同的数据或编号可用于不受我们控制的不同目的(例如,产品 UPC 为 1 11111 11111 1,发票或订单号为 111-11111111-1,两者均由第三个打印方),识别符号有几个有用的目的。

理想情况下,扫描器被编程为向应用程序报告符号(作为一到三个字符的数据前缀,使用 Symbol 或 aim 标准之一),但不能保证这种能力(例如,一台扫描仪在下班后休息,另一个未以相同方式配置的被借用,或者数据由人工键入)

即时用例:从存储在数据库字段中的文本字符串中识别可能的(即有效)符号体系。


示例:

存储的条形码值:“049000042566”

找到的属性

  1. 只有数字;没有小写、大写、符号或控制代码
  2. 长度:12 位
  3. 无符号标识符前缀(既不是符号也不是 aim 风格)

结果(内部;不一定显示

  1. 可能:UPC-A (精确长度匹配)、EAN 13 (修剪初始数字或缺少校验位)、修剪 GTIN 14
  2. 可能的替代方案:任何可变长度符号
  3. 可能:任何可变长度的符号、数字或字母数字
  4. 不太可能,但可能:堆叠或大型符号系统不适合短数值
  5. 拒绝/不可能的符号体系:UPC-E、EAN 8
  6. 拒绝的数据内容:UPS 运单号、URI/URL 等

目的/场景:

为什么要这个? 想象一个信息亭扫描站。有人扫描条形码,根据符号(以尽量减少域冲突),系统要么提供来自正确数据库的信息,要么提示用户输入数据。 (将来,可能会使用显示器的 leu 中的语音响应。)

在仓库中,店员扫描条形码。系统确定它可能是 UPC 代码,在库存数据库中找到它,然后显示库存状态和货架位置以重新上架项目。

店员扫描第二个条形码。系统确定它也可能是 UPC 代码,但未在库存数据库中找到它。系统会提示店员输入来自扫描对象的产品数据。

接下来,店员扫描供应商的发票。扫描的值与已知数据模式不匹配,并且在数据库中未作为异常找到。系统要求店员对扫描的对象进行分类(例如发票、装箱单、其他贸易项目、其他/未知)。店员选择“发票”,系统会提示输入数据或将发票提交到特定邮槽。

最后,店员扫描了另一张发票。系统将可能的符号系统标识为“代码 39”,而且由于我们只有一个供应商一直使用该符号系统,因此系统会指示店员将该发票放入特定的邮槽。

该系统设计为几乎不需要培训(在系统操作中,即),因为在与志愿者或其他部门的人员一起进行灾难响应时,经常缺乏一致的培训或不切实际情况。


注意事项:

来自相同工作的未来可能用例:给定一个特定字符串,确定操作员可以从中选择的数据的可能有效符号选择(例如,从首选符号类型的有序列表中)

第三级用例:分析扫描条码的日志,以确定正在使用哪些符号,告知未来在组织中使用的条码的选择或告知购买新/替换设备(例如,也许我们正在购买昂贵的2D 扫描仪扫描 99.95% 的条码只需要便宜的激光扫描仪)

可能的问题:

  1. 数据是手动键入的,并且包含错​​误或无关符号(例如 UPC 代码中的空格;特殊字符,例如制表符/cr/不间断空格,是在复制/粘贴操作中无意中输入的)
  2. 数据是由条码扫描器自动输入的,但扫描器的配置与预期不同包括符号前缀或回车,如果需要,则排除符号前缀)
  3. 条码扫描仪自动输入数据,但输入时未存储条码校验位
  4. 数据稍后导入;例如:系统停机,因此工作人员使用手机上的应用扫描条形码以备将来处理

显然,让扫描仪提供符号前缀会使整个问题变得微不足道,但在某些情况下可能无法通过策略启用(例如,同一台计算机上的另一个应用程序,例如 Web 表单,需要条形码没有前缀的输入)或受所使用系统的限制(即数据输入到网站字段或通过不为扫描代码创建这些前缀的移动应用程序)。 >


评论和脚注:

明确地说,我确信我可以蛮力这个[2],但我不想为某些看起来必须已经存在的东西重新发明轮子[3]。由于它可以在一定程度上离线完成,我不想依赖网络 API (因此使互联网连接成为依赖项)

创建可重用的模块化代码当然是首选的解决方案。

[1] 例如现有的库、示例函数或一些聪明的算法 - 任何语言或伪代码

[2] 我最初的新手想法是为每个可能的符号系统填充一个带有“真”值的布尔数组,然后通过将任何此类符号系统设置为“假”来排除那些对相关数据无效的(例如长度是否匹配固定长度,值是否包含特定符号体系的无效符号,是否存在暗示某种符号体系的控制代码(如 FNC1 或 ascii)

提醒:根据完成的处理量,一些子字符串 总是在特定符号的机器扫描中发现并不总是 (或从不)在条形码下以人类可读的形式打印。

(例如,如果操作员手动输入来自 usps IMpb 的跟踪编号,则结果将是一个以 数字,例如“92”。当机器扫描时,特别是如果没有被解析为 GS1 数据,数据将是一个 34 位数字:以 AI 开头 “420”后跟一个九位数的邮政编码,两者都不是 打印为人类可读的数字。)

这会影响我们解析数据的方式。

# 1. Initialize data structures and load values / parameters
# 1.1 (optional) if date of scan is available,#     rule out any symbologies not used in the organization at that time
    
# 2. check if symbology prefix present; 
#       if so,compare against valid prefixes 
#       and verify data is valid for the identified symbology (to rule out false-positives)
#    Example: aim prefix    “]L2” —> ‘PDF417 with no tx protocol enabled’
#             Symbol prefix “X”   —> ‘PDF417’ or ‘ISSN EAN’
    
# 3.  check input length (trimmed of leading/trailing whitespace)
# 3.1 Rule out fixed-length codes not matching length of input
#      (or length+1,for codes allowing check digits,in case they were omitted at scan time)
# 3.2 Rule out variable-length codes where input length is greater than their maximum length

# 4. If input string contains:
#     - any lower-case letters,rule out numeric-only and ‘upper-case’-only symbologies
#     - any letters,rule out numeric-only symbologies
#     - any punctuation,keyboard symbols,or control codes,rule out symbologies as appropriate
#     - any control codes that only belong to specific symbologies (such as GS1)
#     
#     [example: a valid URI found in the data may rule out all but a very few symbologies,#               based on
#                 symbols (“:”,“/“),length,and data format]

# 4.1 Is the input string missing any elements used by a remaining symbology in expected usage?
#     (e.g. if string does not contain substring “1Z”,it’s not a UPS tracking barcode,#           and thus highly unlikely to have been encoded using Maxicode)


# 5. If input length matches length of fixed-length symbology that hasn’t already been ruled out,#    mark that symbology as a possible preferred match

# 6. (optional) For each symbology remaining,calculate data checksum per symbology specification
#    and compare to recorded checksum - matching checksums may help to weight likely symbologies
#    not already ruled out

# 7. Check database(s) for matches based on symbologies remaining 
#    (e.g. if UPC-A still a possibility,query UPC/GTIN databases)

# 8. Identify data structure of data for each remaining candidate,and break out components
#    (e.g. UPC country code,GS1 application identifiers,#          postal service level,company-specific codes)

# 9. Present operator with list of possible / impossible symbologies


# 10. display found data 
#     - Highlight if notable data found,such as a GTIN,GS1 AIs,or a shipping tracking number

# 11. If ambiguity on which business process to execute remains,#        ask user to choose process (e.g. log invoice,re-stock item) 
#                 or to identify item scanned (e.g. invoice,Trade product)

保持“真”的值代表有效的可能性;在此之后,可以进行进一步的数据分析、数据库查找和/或业务逻辑。 (上面示例中的步骤 5-11)

[3] 如果我遗漏了一些看似显而易见的内容,请考虑在您的评论或答案中分享您建议的搜索词,以便所有人都能学会更聪明地搜索

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)