Проверьте строку с датой и извлеките часть строки - PullRequest
2 голосов
/ 13 мая 2019

У меня есть тысячи строк текста, которые мне нужно проработать, и интересующие меня строки со строками, которые выглядят следующим образом:

01/04/2019 09:35:41 - Test user (Additional Comments)

В настоящее время я использую этот код для фильтрации всех остальных строк:

If InStr(FullCell(i), " - ") <> 0 And InStr(FullCell(i), ":") <> 0 And InStr(FullCell(i), "(") <> 0 Then

FullCell - это массив, через который я работаю.

, который я знаю, не лучший способ сделать это. Есть ли способ проверить наличие даты в начале строки в формате дд / мм / гггг, а затем извлечь имя пользователя между символами '-' и '('.

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

Какой лучший способ сделать это.

Ответы [ 4 ]

3 голосов
/ 13 мая 2019

Предполагая, Fullcell(i) содержит строку,

If Left(Fullcell(i), 10) Like "##/##/####"

Вернет True, если у вас есть дата (обратите внимание, что она не будет различать dd/mm/yyyy и mm/dd/yyyy.

А

Mid(Fullcell(i), InStr(Fullcell(i), " - ") + 2, InStr(Fullcell(i), " (") - InStr(Fullcell(i), " - ") - 2)

Вернет имя пользователя

2 голосов
/ 14 мая 2019

Вот как бы я это сделал

Уменьшите ваши переменные

Dim ring as Range
Dim dat as variant
Dim FullCell() as string
Dim User as string
Dim I as long

Установите свой диапазон

Set rng = ` any way you choose
Dat = rng.value2

Цикл данных

For i = 1 to UBound(dat, 1)

Разделить данные

    FullCell = Trim(Split(FullCell, "-"))

Проверить, не разделены ли они

    If UBound(FullCell) > 0 Then

Проверить, совпадают ли они

    If IsDate(FullCell(0)) Then
        i  = Instr(FullCell(1), "(")-1)
        If i  then
            User = left$(FullCell(1), i)
            '  Found a user 

        End If
    End If

    End If

Next
2 голосов
/ 13 мая 2019

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

Это выберет дату:

x = 1
Do While Mid(FullCell,1,x) <> " "
    x = x + 1
Loop
strDate = Left(FullCell,x)

При этом будет найден номер символа дефиса, имя пользователя начинается через 2 символа.

x = 1
Do While Mid(FullCell,x,1) <> "-"
    x = x + 1
Loop

Тогда мы найдем конец имени пользователя

y = x + 2
Do While Mid(FullCell,y,1) <> " "
    y = y + 1
Loop

Имя пользователя теперь должно быть символами (от x + 2 до y-1)

strUsername = Mid(FullCell, x + 2, y - (x + 2) - 1)
1 голос
/ 13 мая 2019

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

Ниже я привел пример этого и решил использовать подход RegExp (позднее связывание), но вы также можете использовать строковые функции, как в примерах выше.

Эта функция возвращает имя пользователя, если находит шаблон, который вы упомянули выше, в противном случае возвращает пустую строку.

Private Function ExtractUsername(ByVal SourceString As String) As String

    Dim RegEx As Object
    Set RegEx = CreateObject("vbscript.regexp")

    '(FIRST GROUP FINDS THE DATE FORMATTED AS DD/MM/YYY, AS WELL AS THE FORWARD SLASH)
    '(SECOND GROUP FINDS THE USERNAME) THIS WILL BE SUBMATCH 1
    With RegEx
        .Pattern = "(^\d{2}\/\d{2}\/\d{4}.*-)(.+)(\()"
        .Global = True
    End With

    Dim Match As Object
    Set Match = RegEx.Execute(SourceString)

    'ONLY RETURN IF A MATCH WAS FOUND
    If Match.Count > 0 Then
        ExtractUsername = Trim(Match(0).SubMatches(1))
    End If

    Set RegEx = Nothing

End Function

Шаблон регулярного выражения сгруппирован в три части: дату (и косую черту), имя пользователя и открывающие скобки. Что вас интересует, так это имя пользователя, которое в SubMatch будет номером 1.

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

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

...