Bezdepbonusu7Программирование: статьи и ответы

Вопрос

VBA - анализ текста электронной почты для доступа к экземпляру класса 2000

Автор вопроса: Gary.RayОтветов: 1

Сейчас я поддерживаю устаревшее приложение VBA/Access 2000 для клиента. У них есть клиент, который отправляет заказы по электронной почте с текстом, который выглядит следующим образом.

Contact: Peggy Hill
Company: Arlen Residential Mortgage Finance Co
Address: 43456 South 18939 West, Suite 47995
City: Arlen City
ContactState: TX
ContactZip: 88888
Phone: 8019990000
Email: [email protected]

DateOrdered: 4/6/09
DateDue: 4/15/09

и т.д...

Приложение имеет класс VBA со всеми атрибутами, но не может разобрать данные в соответствующие поля. Моему клиенту нужна форма, в которую он может вставить текст из электронного письма, проанализировать его в полях для проверки, а затем записать в базу данных.

Проблемы/Факты:

  1. Каждое значение устанавливается с помощью токена 'ValueName: "
  2. В зависимости от того, как почтовые клиенты искажают строку, в конце каждой строки может быть или не быть CrLf.
  3. Отсутствующие значения будут иметь только токен, без "" или пустого места.

Я хотел бы создать функцию CreateOrder(OrderText As String), которая будет читать текст из формы, но я понятия не имею, как обрабатывать синтаксический анализ в VBA.
Я начал создавать 2D-массив с предварительно введенными токенами, но это кажется неуклюжим. так как я должен прочитать следующий элемент в массиве, чтобы выяснить, когда прекратить прием данных для предыдущего токена.

Предложения?

stringvbams-access

Ответы

Ответ 1 · рейтинг 3 · Mitch Wheat

Это довольно минималистично; пожалуйста, добавьте свою собственную проверку ошибок. Необходимо добавить ссылку на "Среду выполнения сценариев Microsoft".

Public Function Parse(msg As String) As Dictionary
   Dim i As Integer, pos As Integer
   Dim line As Variant
   Dim lines() As String
   Dim dict As New Dictionary

   lines = Split(msg, vbCrLf)
   For Each line In lines()
      pos = InStr(1, line, ":", vbTextCompare)
      If pos <> -1 Then
        dict.Add Trim$(Left$(line, pos - 1)), Trim$(Right$(line, Len(line) - pos))
      End If
   Next

   Rem: Access values like this (with null checks):
   Rem:    dict("Contact"), dict("Address")

   Set Parse = dict

End Function

Я использовал его, создав простую форму с текстовым полем и кнопкой и добавил это к событию нажатия кнопки:

Private Sub Command2_Click()
    Dim dict As Dictionary

    Text0.SetFocus
    Set dict = Parse(Text0.text)

    Debug.Print dict("Contact"), dict("Address")

    Rem clear up when done
    Set dict = Nothing

End Sub

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы