V \ B脚本从文本文件中提取日期并对其进行格式化

时间:2014-09-23 04:30:45

标签: date vbscript extraction date-formatting

我在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 

2 个答案:

答案 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?)你应该能够处理你的大多数输入并识别人类必须处理怪胎的案例。