1

Недавно я начал работать над таблицей Excel, которая зависит от строки описания, размещенной в базе данных Oracle.

Строка идет примерно так

1 год Арендная плата за парковку на период с 18-8-1438 по 17-8-1439 / 15-5-17 до 4-5-18

6 месяцев арендной платы за улицу с 01-08-1438 по 01-02-1439 / 28-04-2017 по 21-10-2017

1 год арендной платы за 310113 - аутлет на период с 01-01-1438 по 30-12-1438

и любая другая форма, которая удобна для человека, публикующего описание.

Теперь мой вопрос заключается в том, как мне легко извлечь даты из этого описания с помощью функции Excel или макроса VBA. Бонусом будет возможность конвертировать даты хиджры в григорианские на лету, а не конвертировать их через веб-сервис.

Изменить: Забыл упомянуть желаемый вывод (спасибо Мате Джухас), выход должен быть что-то, что может быть использовано в формуле days360, например, мм / дд / гггг. В каждой записи будет в основном 2 даты, дата начала и дата окончания контракта, с возможностью публикации того же самого вместе с хиджрами и редко только с датой хиджры. Всегда проверяйте для дд / мм / гггг или дд / мм / гг, поскольку это их обычный формат публикации.

3 ответа3

1

Вот решение с использованием VBA без Regex:

Sub GetDateCandidates()
    Dim i As Long, N As Long, s As String
    Dim K As Long, a, bry

    K = 2
    N = Cells(Rows.Count, "A").End(xlUp).Row

    For i = 1 To N
        s = Cells(i, 1).Value
        ary = Split(s, " ")
        For Each a In ary
            bry = Split(a, "-")
            If UBound(bry) = 2 Then
                If (TestBry(bry)) Then
                    Cells(i, K).Value = "'" & a
                    K = K + 1
                End If
            End If
        Next a
        K = 2
    Next i
End Sub

Public Function TestBry(b) As Boolean

    TestBry = False

    If Not IsNumeric(b(0)) Then Exit Function
    If Not IsNumeric(b(1)) Then Exit Function
    If Not IsNumeric(b(2)) Then Exit Function
    If Len(b(0)) > 2 Then Exit Function
    If Len(b(1)) > 2 Then Exit Function
    If Len(b(2)) = 2 Or Len(b(2)) = 4 Then TestBry = True
End Function

Фразы в столбце А. Каждая фраза разделяется на слова с использованием пробелов в качестве разделителя. Каждое слово разделяется на элементы, используя тире в качестве разделителя. Если:

  1. есть три пункта
  2. все три элемента числовые
  3. длина первых двух элементов равна 1 или 2
  4. длина третьего элемента - 2 или 4

Слово хранится рядом с фразой:

0

В примерах, которые вы привели, это соответствует шаблону.

Шаблон: по крайней мере одна цифра, за которой следует символ, который является либо тире, либо косой чертой. (x2) и заканчивая 2 или 4 цифрами. И все они в одной линии.

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

\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}

Это будет соответствовать, например, формату DD/MM/YYYY, а также формату DM-YY и их перестановкам.

Если вы хотите проанализировать формат даты / даты, вы можете использовать эту строку поиска:

\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}\s*to\s*\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}

Конечно, вам нужно запустить его через движок регулярных выражений и получить результат.

Тогда вы можете захотеть стандартизировать указанный вывод, чтобы он соответствовал формату ДД / ММ / ГГГГ - хотя я должен сказать, что предпочитаю ГГГГ-ММ-ДД, учитывая, как компьютеры индексируют объекты для поиска. Вы можете сделать это и с помощью регулярных выражений, сгруппировав числа и реорганизовав их с поиском и заменой. Дайте мне знать, если это звучит как то, что вы хотели бы попробовать.

Наконец, вы можете преобразовать стандартизированный вывод в григорианский календарь. Что вы могли бы сделать, запустив формулу Excel, если вычислите значение года меньше, чем, скажем, 1900 или что-то в этом роде.

Удачи. Стандартизация таких данных может быть кошмаром, хотя сценарии и регулярные выражения очень помогают.

0

1. извлечь даты

В таких случаях я использую надстройку поиска / замены RegEx , которая добавляет функциональность регулярных выражений в Excel.

Вы можете использовать его также как формулу массива:

  • так как вы ожидаете максимум четыре даты на ячейку, выберите четыре ячейки подряд (например, B3:E3 в примере)
  • формула типа:
    =RegExFind(A3,"\d+-\d+-\d+")
  • нажмите CTRL+Shift+Enter
  • скопировать формулу вниз

Это будет выглядеть для всех дат, введенных как 1/2 цифра день / месяц и 2/4 цифра год, части разделены одним -

2. конвертировать извлеченные тексты в даты

В примерах я использовал функции DATEVALUE , которые работают только для григорианского календаря, у меня нет опыта работы с хиджрами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .