Скрипт V\B для извлечения даты из текстового файла и его форматирования

Я работаю на ОКР. Мы автоматически извлекаем текст из счетов. Когда содержимое счета извлекается, оно сохраняется в текстовом файле, а затем мы пишем сценарии для извлечения данных из текстового файла в соответствии с нашими требованиями. Одно требование, которое заставило меня застрять, заключается в том, что мне нужно извлечь дату из текстового файла, который не записан ни в каком конкретном формате. Написано как 12 08 2014 в строке. Мне нужно извлечь это и распечатать в формате дд/мм/гггг. Кроме того, даты могут быть записаны в любом формате, например, 2 декабря 2013 г., 12-12-2013 г., 12 августа 2013 г. и так далее... Мне нужно прочитать дату и извлечь ее в виде дд/мм/гггг.

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 

person abhijeet_chib    schedule 23.09.2014    source источник


Ответы (2)


Просто попробуйте назначить дату. Функции даты распознают большинство дат.

person Noodles    schedule 23.09.2014
comment
У меня проблема в том, что в документе нет предварительно заданного места, оно может быть где угодно в текстовом файле. Что касается фиксированного текста, опять же, он не постоянный. Иногда дата указывается после номера счета, иногда после описания. Дата может быть вверху, в середине или внизу. Все зависит от формата счета-фактуры. Данные просто извлекаются из счета-фактуры и сохраняются в текстовом файле, откуда мы должны восстановить необходимые поля. Есть ли способ найти дату в текстовом файле без какой-либо фиксированной помощи из любых других полей, ключевых слов и т. д. - person abhijeet_chib; 23.09.2014

Вам нужен план, основанный на идее. Моя идея состоит в том, чтобы применить набор пар регулярного выражения (чтобы вырезать представление даты из ваших данных) и функцию преобразования (чтобы сделать из этого сокращения дату).

В коде:

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

Добавляя/улучшая регулярные выражения (будет ли ваше OCR иногда выводить O (заглавная буква o) вместо (цифры) 0?) и функции преобразования (в каких случаях вы можете доверять CDate?), вы должны быть в состоянии обрабатывать большую часть вашего ввода и выявить случаи, в которых человеку приходится иметь дело с уродами.

person Ekkehard.Horner    schedule 23.09.2014
comment
Большое спасибо, Эккехард. - person abhijeet_chib; 23.09.2014
comment
Однако теперь есть другая проблема. В некоторых счетах дата указана как 06.01.2014. Проблема в том, что мы не знаем формат здесь. 1 может быть месяц или 1 может быть день. Мы должны извлечь его и распечатать в формате дд/мм/гггг. Есть ли способ понять формат, в котором мы его получили? - person abhijeet_chib; 23.09.2014
comment
Дата 06.01.2014 Как понять, в каком поле день, а в каком месяц. 1 может быть день или месяц, есть ли способ понять это. - person abhijeet_chib; 23.09.2014
comment
Я тоже не могу запустить код, не могли бы вы помочь мне. - person abhijeet_chib; 23.09.2014
comment
какие еще идеи..?? - person abhijeet_chib; 24.09.2014