Регулярное выражение vba для определения случая для цикла - PullRequest
0 голосов
/ 09 апреля 2020

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

Username     : 1110491103121002@mil   Index        : 130   
Assigned IP : xxx.xx.xx.xxx          Public IP    : xxx.x.xxx.xx  
Login Time   : 08:27:04 MST Tue Mar 24 2020  
Duration     : 1h:33m:00s  
Inactivity   : 0h:20m:46s  
Username     : 1254709600121004@mil   Index        : 145 
Login Time   : 09:40:14 MST Tue Mar 24 2020  
Duration     : 0h:19m:50s 
Inactivity   : 0h:00m:00s  
Username     : 1362984650@mil   Index       : 182  
Assigned IP  : xxx.xx.xx.xx           
Public IP   : xx.xxx.xxx.xx  
Login Time   : 09:13:38 MST Tue Mar 24 2020  
Duration   : 0h:46m:26s  
Inactivity   : 0h:00m:00s

Как вы можете видеть, в некоторых блоках нет записи для Назначенный IP и Publi c IP. Я пытаюсь превратить это в файл с разделителями табуляции, поэтому я написал al oop в VBA (я пробовал и Excel, и Access - мне все равно, в каком это происходит), который найдет все заголовки ( например, «Имя пользователя», «Индекс» и т. д. c.) и соответствующие пробелы и замените их на вкладки. Это прекрасно работает, когда блок имеет все строки. То, что я пытаюсь сделать, это определить, начинается ли строка, которая следует за порядковым номером, буквой A или L. Если она начинается с буквы A, то ничего (сделать следующий шаг в коде), но если она начинается с буквы L, вставьте две вкладки и двигайтесь дальше. В конечном итоге это будет импортировано либо в электронную таблицу, либо в таблицу доступа (любой из этих инструментов приемлем), мне просто нужно сначала правильно отформатировать его в текстовом файле.

Опять же, у меня все хорошо с заменой. То, с чем я борюсь, это определить это. Я написал регулярное выражение как "Index *: [0-9]{1,6}[\r\n]L". Я НИКОГДА не получаю совпадение, хотя.

Что я здесь не так делаю?

РЕДАКТИРОВАТЬ: По какой-то причине это не показывает, что между Index: 145 и "Login Time" есть разрыв строки, но в текстовом файле он есть.

РЕДАКТИРОВАТЬ: Как это выглядит сейчас:

Username     : 1254709600121004@mil   Index        : 145<CR><LF>
Login Time   : 09:40:14 MST Tue Mar 24 2020  

 What I want:
1254709600121004@mil vbTab 145 vbTab vbTab vbTab 09:40:14 MST Tue Mar 24 2020  

1 Ответ

1 голос
/ 09 апреля 2020

Если вы просто выполняете Regex в качестве промежуточного шага перед импортом хорошо отформатированных данных, вы можете попробовать импортировать их прямо в Access. Я собрал небольшой кусочек кода VBA, который успешно работает с вашими примерами данных:

Sub sGetIPData()
    On Error GoTo E_Handle
    Dim strFile As String
    Dim intFile As Integer
    Dim strInput As String
    Dim strDummy As String
    Dim db As DAO.Database
    Dim rsData As DAO.Recordset
    Set db = DBEngine(0)(0)
    Set rsData = db.OpenRecordset("SELECT * FROM tblRegex WHERE 1=2;")
    strFile = "J:\downloads\regex.txt"
    intFile = FreeFile
    Open strFile For Input As intFile
'   start by adding the first record
    rsData.AddNew
    Line Input #intFile, strInput
    strDummy = Left(strInput, InStr(strInput, "Index") - 1)
    strDummy = Mid(strDummy, 16)
    rsData!UserName = Trim(strDummy)
    strDummy = Mid(strInput, InStr(strInput, "Index") + 1)
    strDummy = Mid(strDummy, InStr(strInput, ":") + 1)
    rsData!Index = Trim(strDummy)
    Do
        Line Input #intFile, strInput
        If Left(strInput, 8) = "Username" Then
'   insert the record that we have just finished with
            rsData.Update
'   and now add the next record
            rsData.AddNew
            strDummy = Left(strInput, InStr(strInput, "Index") - 1)
            strDummy = Mid(strDummy, 16)
            rsData!UserName = Trim(strDummy)
            strDummy = Mid(strInput, InStr(strInput, "Index") + 1)
            strDummy = Mid(strDummy, InStr(strInput, ":") + 1)
            rsData!Index = Trim(strDummy)
        ElseIf Left(strInput, 8) = "Assigned" Then
            If InStr(strInput, "Public IP") > 0 Then
                strDummy = Trim(Mid(strInput, InStr(strInput, ":") + 1))
                strDummy = Left(strDummy, InStr(strDummy, "Public") - 1)
                rsData!AssignedIP = Trim(strDummy)
                strDummy = Mid(strInput, InStr(strInput, "Public"))
                strDummy = Trim(Mid(strDummy, InStr(strDummy, ":") + 1))
                rsData!PublicIP = strDummy
            Else
                rsData!AssignedIP = Trim(Mid(strInput, InStr(strInput, ":") + 1))
            End If
        ElseIf Left(strInput, 5) = "Login" Then
            rsData!LoginTime = Trim(Mid(strInput, InStr(strInput, ":") + 1))
        ElseIf Left(strInput, 8) = "Duration" Then
            rsData!Duration = Trim(Mid(strInput, InStr(strInput, ":") + 1))
        ElseIf Left(strInput, 10) = "Inactivity" Then
            rsData!Inactivity = Trim(Mid(strInput, InStr(strInput, ":") + 1))
        ElseIf Left(strInput, 6) = "Public" Then
            rsData!PublicIP = Trim(Mid(strInput, InStr(strInput, ":") + 1))
        Else
            Debug.Print "Unknown: " & strInput
        End If
    Loop Until EOF(intFile)
'   finally add the current record
    rsData.Update
sExit:
    On Error Resume Next
    rsData.Close
    Set rsData = Nothing
    Set db = Nothing
    Reset
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sGetIPData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

Возможно, потребуется еще несколько проверок, но это может помочь вам.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...