我在OCR上工作。我们自动从发票中提取文本。当提取发票的内容时,它们存储在文本文件中,然后我们编写脚本以根据我们的要求从文本文件中提取数据。 让我陷入困境的一个要求是,我需要从未以任何特定格式编写的文本文件中提取日期。它写成2014年12月12日。我需要提取它并以dd / mm / yyyy格式打印出来。 此外,日期可以以任何格式书写,例如2013年12月2日,2013年8月12日,2013年8月12日等等......我需要阅读日期并以dd / mm / yyyy的形式提取日期
ORDERED SHIPPED
THE DATE IS IN THE NEXT LINE 28 08 14, I NEED TO EXTRACT THIS AND PRINT IT IN THE DD/MM/YYYY FORMAT
01239751 **28 08 14** 03 09 14 E31192-00 1
CUST.NO. ItN1 R 0 R NO SALE MM
NOM CI WATT VOTRF NO nr CAMMANOF in-W.01M
ADDRESS HERE**strong text**
Te1:(123)123-1234/ Fax:(123)795-1234
Facture / Invoice
OUTPS:R-103958989 CONE:MONS Taws> NET 60 DAYS
SOLD TO / VENDU A SHIPPED TO / EXPEDIE A
答案 0 :(得分:0)
尝试分配日期。日期功能可识别大多数日期。
答案 1 :(得分:0)
您需要一个基于想法的计划。我的想法是应用一组正则表达式(从数据中剪切日期表示)和转换函数(以便从该剪切中生成日期)。
在代码中:
Option Explicit
' 12-12-2013
Function DMY(oMT)
DMY = DateSerial(CInt(oMT.SubMatches(2)), CInt(oMT.SubMatches(1)), CInt(oMT.SubMatches(0)))
End Function
' CDate will reliably convert the extracted value
Function TrustCDate(oMT)
TrustCDate = CDate(oMT.Value)
End Function
' 12-12-2013
Dim reDMY : Set reDMY = New RegExp
reDMY.Global = True
reDMY.Pattern = "(\d{2})-(\d{2})-(\d{4})"
' collection of re, func pairs
Dim aOps : aOps = Array( _
Array(reDMY, GetRef("DMY")) _
, Array(reDMY, GetRef("TrustCDate")) _
)
Dim sAll : sAll = CreateObject("Scripting.FileSystemObject").OpenTextFile(".\25986937.txt").ReadAll()
Dim aOp
For Each aOp In aOps
Dim oMTS : Set oMTS = aOp(0).Execute(sAll)
If 1 = oMTS.Count Then
Dim dtCut : dtCut = aOp(1)(oMTS(0))
WScript.Echo TypeName(dtCut), dtCut
End If
Next
输出:
cscript 25986937.vbs
Date 12.11.2014
Date 11.12.2014
表示以:
开头的文件ORDERED SHIPPED
01239751 12-11-2014 03 09 14 E31192-00 1
CUST.NO. ItN1 R 0 R NO SALE MM
通过添加/改进RegExps(你的OCR有时会提供O(大写字母o)而不是(数字)0吗?)和转换函数(在哪种情况下你可以信任CDate?)你应该能够处理你的大多数输入并识别人类必须处理怪胎的案例。