Извлечение определенных слов из Textpad и запись в Microsoft Excel - PullRequest
1 голос
/ 21 мая 2019

Я хочу извлечь числа после определенных слов из столбцов TextPad в Excel.

Пример файла TextPad.

INFO CRITERIA is MATCHED. DISPLAY ID 123456 AND AT T=369   
MAY BE MATCHING OR MAY NOT BE
INFO CRITERIA is MATCHED. DISPLAY ID 12345678 AND AT T=3698  
SEVERAL PACKAGES TO BE FOLLOWED
WAIT UNTIL THE PROCESS FINISHES
INFO CRITERIA is MATCHED. DISPLAY ID 123 AND AT T=32
REGARDING THE TIMINGS..

Я хочу извлечь идентификатор DISPLAY ID и время (T =)в разные столбцы в Excel.

Ниже приведен код, который я пробовал.

Как использовать массив и цикл?Как читать остальные строки?Если мы используем функцию Mid и число символов после «T =» меняется в каждой строке, будет сложно получить правильные числа.

Sub Extract()
Dim myFile As String, _
    text As String, _
    textline As String, _
    DISPLAY As Integer, _
    TIME As Integer

    myFile = Application.GetOpenFilename()
    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        text = text & textline
    Loop
    DISPLAY = InStr(text, "DISPLAY ID")
    TIME = InStr(text, "AT T=")
    Range("A1").Value = Mid(text, DISPLAY + 10, 8)
    Range("B1").Value = Mid(text, TIME + 5, 6)
End Sub

1 Ответ

1 голос
/ 22 мая 2019

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

Sub Extract()
    Dim myFile As Variant ' Handle Cancel
    Dim text As String
    Dim textline As String
    Dim idx As Long     ' separate position from data
    Dim DisplayName As String
    Dim DisplayFound As Boolean 'flag for if rw should be incremented
    Dim TimeName As String
    Dim TimeFound As Boolean
    Dim FNum As Integer ' FreeFile returns an Integer
    Dim rw As Long      'counter for output row
    Dim ws As Worksheet ' best to avoid Active objects

    On Error GoTo EH ' ensure file is closed

    ' speed thing up a bit
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    DisplayName = "DISPLAY ID"
    TimeName = "AT T="

    rw = 1 ' start output at row 1
    myFile = Application.GetOpenFilename()
    If myFile = False Then GoTo CleanUp ' handle cancel
    Set ws = ActiveSheet ' or whatever sheet you need

    FNum = FreeFile
    Open myFile For Input As #FNum
    With ws
        Do Until EOF(FNum)
            Line Input #FNum, textline

            DisplayFound = False
            TimeFound = False
            idx = InStr(textline, DisplayName)
            If idx Then ' DisplayName was found
                text = Trim(Mid$(textline, idx + Len(DisplayName)))
                idx = InStr(text, " ")
                If idx Then  'allow for possibility  value is at end of string
                    text = Trim(Left$(text, idx - 1))
                End If
                .Cells(rw, 1).Value = text
                DisplayFound = True
            End If
            idx = InStr(textline, TimeName)
            If idx Then ' TimeName was found
                text = Trim(Mid$(textline, idx + Len(TimeName)))
                idx = InStr(text, " ")
                If idx Then  'allow for possibility  value is at end of string
                    text = Trim(Left$(text, idx - 1))
                End If
                .Cells(rw, 2).Value = text
                TimeFound = True
            End If
            If DisplayFound Or TimeFound Then
                rw = rw + 1  'increment output row
            End If
        Loop
    End With
CleanUp:
    On Error Resume Next
    Close #FNum
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
Exit Sub
EH:
    'Add Error Handling here

    'Then clean up
    Resume CleanUp
End Sub

Обратите внимание, что запись непосредственно на лист, такой как эта ячейка, может быть слишком медленной,особенно если вы обрабатываете много файлов или они большие.Если он слишком медленный для ваших нужд, подумайте о переходе к подходу Variant Array (много примеров этого здесь, в SO)

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