Как импортировать текстовый файл переменной длины, чтобы превзойти VBA и разбить его на несколько столбцов? - PullRequest
0 голосов
/ 15 октября 2018

Это мой первый вопрос для этого сообщества.

Я хотел бы знать, как импортировать текстовый файл переменной длины (из сценария bash) в Excel с VBA и разбить его на несколько столбцов.Я учусь использовать VBA и пока не могу понять.Вот что у меня есть:

Список серверов из скрипта:

Servers list from script

Этот вывод мне нужен в excel:

Servers arranged

Поля «День» и «% Idle» будут добавлены макросом VBA.

Будут добавлены числа от 6 до 11вручную, так что никаких проблем нет.

Заранее спасибо и наилучшие пожелания всем!

1 Ответ

0 голосов
/ 16 октября 2018

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

Вам нужно будет изменить значение FILE_PATH в функции splitTextFileByServer (ниже).), где бы он ни находился на вашей машине.

Option Explicit

Private Sub WriteServerListToSheet()
    Dim logsSplitByServer() As String
    logsSplitByServer = splitTextFileByServer()

    Dim interimArray() As String
    Dim outputArray() As Variant: ReDim outputArray(1 To 8, 1 To 2)

    With ThisWorkbook.Worksheets("Sheet1").Range("A1")

        Dim serverIndex As Long
        Dim readIndex As Long
        Dim outputColumnOffset As Long

        For serverIndex = LBound(logsSplitByServer) To UBound(logsSplitByServer)
            interimArray = VBA.Strings.Split(logsSplitByServer(serverIndex), vbNewLine, -1, vbBinaryCompare)
            If (UBound(interimArray) + 1) <> UBound(outputArray) Then ' (+1) as interimArray is 0-based
                ReDim outputArray(1 To (UBound(interimArray) + 2), 1 To 2) '(+2) as 0-based and we want a row for headers: Day, %Idle
            End If

            ' Assume first item in interimArray is: server***
            outputArray(1, 1) = interimArray(LBound(interimArray))
            outputArray(2, 1) = "Day"
            outputArray(2, 2) = "%Idle"

            For readIndex = (LBound(interimArray) + 1) To UBound(interimArray)
                outputArray(2 + readIndex, 2) = interimArray(readIndex) ' (2 + ... as we want to skip first 2 rows
            Next readIndex

            .Offset(0, outputColumnOffset).Resize(UBound(outputArray, 1), UBound(outputArray, 2)).Value2 = outputArray
            outputColumnOffset = outputColumnOffset + 3 ' Change this if you decide to add columns
        Next serverIndex

    End With

End Sub

Private Function splitTextFileByServer() As String()
    Const FILE_PATH As String = "C:\Users\USER\Desktop\serverslist.txt"

    If Len(VBA.FileSystem.Dir$(FILE_PATH)) = 0 Then
        MsgBox ("No file exists at: " & FILE_PATH)
        Exit Function
    End If

    Dim fileContents As String
    ' Read file into memory; assumes it will fit.
    Open FILE_PATH For Binary Access Read As #1
    fileContents = VBA.Strings.Space$(LOF(1))
    Get #1, 1, fileContents
    Close #1

    Dim outputArray() As String
    outputArray = VBA.Strings.Split(fileContents, "########################################" & vbNewLine, -1, vbBinaryCompare)

    splitTextFileByServer = outputArray
End Function

Если это не сработает, дайте мне знать, почему / что не так с выводом.

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