Сравните значения таблицы Excel с каждой строкой текстового файла и верните выходные данные в зависимости от результата - PullRequest
1 голос
/ 02 апреля 2012

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

  • Мой ввод:

    • Таблица Excel:
      +----------+------------+
      |   <strong>Name</strong>   |  <strong>Int type</strong>  |
      +----------+------------+
      | Switch-1 |            |
      | SERVER1  | Production |
      | SERVER2  | OOB        |
      | Switch-2 |            |
      | SERVER3  | Production |
      | SERVER4  | Other      |
      +----------+------------+
      
    • Текстовый файл:
      server1-prod.fqdn.com 86400 IN A 192.168.0.10
      server1-oob.fqdn.com 600 IN A 192.168.0.11
      server2-prod.fqdn.com 600 IN A 192.168.0.12
      server2-oob.fqdn.com 600 IN A 192.168.0.13
      server3-prod.fqdn.com 300 IN A 192.168.0.14
      server3-oob.fqdn.com 600 IN A 192.168.0.15
      server4-foo.fqdn.com 86400 IN A 192.168.0.16
      
  • Мой желаемый вывод:

    Switch name: Switch-1
    Interface name: server1-prod.fqdn.com - IP Address: 192.168.0.10
    Interface name: server2-oob.fqdn.com - IP Address: 192.168.0.11
    Switch name: Switch-2
    Interface name: server3-prod.fqdn.com - IP Address: 192.168.0.12
    server4-foo.fqdn.com Unknown interface type: Other.
    

Мой текущий код:

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\Server-List-by-Switch.xlsx")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("FQDN-and-IP.txt")

strNextLine = objFile.Readline
arrList = Split(objFile.ReadLIne(),vbCrLf)
intRow = 2

objFile.Close

Do Until objExcel.Cells(intRow,1).Value = ""
    objHostName = objExcel.Cells(intRow,1).Value
    objIntfType = objExcel.Cells(intRow,2).Value

    If InStr(1,objExcel.Cells(intRow,1).Value,"Switch-",1) > 0 Then

        Wscript.Echo vbCrLF & "Switch Name: " & objHostName

    ElseIf InStr(1,objExcel.Cells(intRow, 1).Value,"Switch-",1) = 0 And InStr(1,objExcel.Cells(intRow,2).Value,"Production",1) > 0 then

            For Each line In arrList
                objFQDN = LCase(objHostName & "-prod.fqdn.com.")
                strFQDN = splitRE (strNextLine, "\s+")
                Wscript.Echo strFQDN(0)
                If InStr(Lcase(line),objFQDN) > 0 Then
                    strIPAddress = Right(line, Len(line) - InStrRev(line," ") )
                    Wscript.Echo "Interface name(Production): " & strFQDN & " - IP Address: " & strIPAddress
                End If
            Next

    ElseIf InStr(1,objExcel.Cells(intRow, 1).Value,"Switch-",1) = 0 And InStr(1,objExcel.Cells(intRow,2).Value,"OOB",1) > 0 then

            For Each line In arrList
                objFQDN = LCase(objHostName & "-oob.fqdn.com.")
                strFQDN = splitRE (strNextLine, "\s+")
                Wscript.Echo strFQDN(0)
                If InStr(Lcase(line),objFQDN) > 0 Then
                    strIPAddress = Right(line, Len(line) - InStrRev(line," ") )
                    Wscript.Echo "Interface name(Production): " & strFQDN & " - IP Address: " & strIPAddress
                End If
        Next

    Else 

        Wscript.Echo objHostName & " has an unknown interface type: " & objIntfType

    End If

    intRow = intRow + 1

Loop

Function splitRE(strSource, pattern)
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern =pattern
        splitRE = Split(.Replace(strSource, " "), " ")
    End With
End Function 

objExcel.Quit

Единственная проблема сейчас заключается в том, что переменная strFQDN заполняется только 1-й строкой текстового файла, поэтому сравнение не удается:

server1-prod.fqdn.com.

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Ваш код сложен без видимой причины.Например, почему макрос открывает книгу «C: \ Server-List-by-Switch.xlsx», а не сидит внутри?

Я не знаю, что Wscript.Echo делает, так что использовал Debug.Printдля вывода в Immediate Window.Я не фанат наличия трехсимвольного идентификатора в начале каждой переменной.Но если они используются, они должны быть правильными.Поэтому я думаю, objFile в порядке, потому что это объект, но objHostName неверен, потому что это строка.

Я упростил ваш код, но сохранил структуру.Это означает, что этот код не может создать строку вывода server4-foo.fqdn.com Unknown interface type: Other., поскольку ваш код проверяет таблицу Excel, а не текстовый файл.Код может быть повторно упорядочен, но вам необходимо уточнить характер данных.

У меня есть рабочая таблица «Сервер-список-за-коммутатором» в рабочей книге.Он содержит:

  |   A      |    B      |
1 | Name     | Intf type |
2 | Switch-1 |           |
3 | SERVER1  | Production| 
4 | SERVER2  | OOB       |
5 | Switch-2 |           |
6 | SERVER3  | Production| 
7 | SERVER4  | Other     |

Вывод макроса:

Switch Name: Switch-1
Interface name: server1-prod.fqdn.com - IP Address: 192.168.0.10
Interface name: server2-oob.fqdn.com - IP Address: 192.168.0.13
Switch Name: Switch-2
Interface name: server3-prod.fqdn.com - IP Address: 192.168.0.14
SERVER4 has an unknown interface type: Other

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

Option Explicit
Sub GenIPAddressReport()

  Dim arrList() As String
  Dim FQDN As String
  Dim FQDNPart() As String
  Dim HostName As String
  Dim IntfType As String
  Dim intRow As Long
  Dim IPAddress As String
  Dim Line As Variant
  Dim LinePart() As String
  Dim objFile As Object
  Dim objFSO As Object

  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objFile = objFSO.OpenTextFile(ActiveWorkbook.Path & "\FQDN-and-IP.txt")

  arrList = Split(objFile.ReadAll(), vbCrLf)

  objFile.Close
  Set objFile = Nothing

  'For Each Line In arrList
  '  Debug.Print Line
  'Next

  intRow = 2
  With Worksheets("Server-List-by-Switch")

  Do Until .Cells(intRow, 1).Value = ""
    HostName = .Cells(intRow, 1).Value
    IntfType = .Cells(intRow, 2).Value
    If InStr(1, HostName, "Switch-") > 0 Then
      Debug.Print "Switch Name: " & HostName
    ElseIf InStr(1, HostName, "Switch-") = 0 And _
           InStr(1, IntfType, "Production") > 0 Then
      For Each Line In arrList
        FQDN = LCase(HostName & "-prod.fqdn.com")
        LinePart = Split(LCase(Line), " ")
        If FQDN = LinePart(0) Then
          Debug.Print "Interface name: " & LinePart(0) & _
                      " - IP Address: " & LinePart(UBound(LinePart))
          Exit For
        End If
      Next
    ElseIf InStr(1, HostName, "Switch-") = 0 And _
           InStr(1, IntfType, "OOB") > 0 Then
      For Each Line In arrList
        FQDN = LCase(HostName & "-oob.fqdn.com")
        LinePart = Split(LCase(Line), " ")
        If FQDN = LinePart(0) Then
          Debug.Print "Interface name: " & LinePart(0) & _
                      " - IP Address: " & LinePart(UBound(LinePart))
          Exit For
        End If
      Next
    Else
       Debug.Print HostName & " has an unknown interface type: " & IntfType
    End If
    intRow = intRow + 1
  Loop

  End With

End Sub
0 голосов
/ 02 апреля 2012

просто дикая догадка - замените оба

strFQDN = splitRE (strNextLine, "\s+") с

strFQDN = splitRE (line, "\s+") <Ч /> или обновите strNextLine другими строками, теперь это всегда первая строка ..

...