2015-11-07 1 views
2

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

device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274 

Я попытался ниже:

Const ForReading = 1 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objTextFile = objFSO.OpenTextFile _ 
    ("d:\vbfile.txt", ForReading) 

Do Until objTextFile.AtEndOfStream 
    strNextLine = objTextFile.Readline 
    arrServiceList = Split(strNextLine , " ") 

    For i = 0 to Ubound(arrServiceList) 
     Wscript.Echo arrServiceList(i) 
    Next 
Loop 

он генерирует ниже

device_name="Text 
Data" 
d_id=7454579598 
status="Active" 
Key=947-4378-43248274 

Ожидаемый выходной

device_name="Text Data"  
d_id=7454579598 
status="Active" 
Key=947-4378-43248274 
+0

ли линии всегда точной формы? –

+0

Имя поля может отличаться ... – kreya

ответ

3

Как об этом подходе :

Option Explicit 

Const ForReading = 1 
Dim FSO, keyValueExpr 
Set FSO = CreateObject("Scripting.FileSystemObject") 

Set keyValueExpr = New RegExp 
keyValueExpr.Pattern = "\b(\w+)=(""[^""]*""|\S*)" 
keyValueExpr.Global = True 

Dim result, record, match 
Set result = CreateObject("Scripting.Dictionary") 

With FSO.OpenTextFile("D:\vbfile.txt", ForReading) 
    While Not .AtEndOfStream 
     Set record = CreateObject("Scripting.Dictionary") 
     result.Add result.Count + 1, record 
     For Each match In keyValueExpr.Execute(.ReadLine) 
      record.Add match.SubMatches(0), match.SubMatches(1) 
     Next 
    Wend 
    .Close 
End With 

Dim msg, lineNo, key 
For Each lineNo In result 
    msg = "Line " & lineNo & vbNewLine 
    For Each key In result(lineNo) 
     msg = msg & vbNewLine & key & ": " & result(lineNo)(key) 
    Next 
    MsgBox msg 
Next 

Он использует регулярное выражение, которое может идентифицировать пары ключ-значение, которые удовлетворяют этим условиям:

  • Ключ представляет собой строку символов (AZ), цифры (0-9) или подчеркивания (_)
  • Значение - это все, что заключено в двойные кавычки или что-либо кроме пробела.
  • Сравнить https://regex101.com/r/zL2mX5/1

Программа создает вложенные словари, внешний словарь содержащий все строки файла с соответствующими номерами строк (1..n) для ключей, каждый внутренний словарь держит пары ключ-значение найдено на каждой линии.

Это расположение дает возможность адресовать каждое значение очень удобно:

value = result(3)("status") 
+0

Спасибо за ответ. Это работает. Теперь у меня есть еще одно поле, такое как src = 00: 0: 00: 0: 00: 0. Как это прочитать? Не могли бы вы также указать reg exp для этого? – kreya

+1

Мое регулярное выражение уже считывает эти поля. – Tomalak

2

Вот функция, которая может помочь. Он принимает строку и разделитель и возвращает массив, полученный путем разделения на разделителе - всякий раз, когда разделитель не внутри цитаты:

Function SmartSplit(s, d) 
    Dim c, i, j, k, n, A, quoted 
    n = Len(s) 
    ReDim A(n - 1) 
    quoted = False 
    i = 1 
    k = 0 
    For j = 1 To n 
     c = Mid(s, j, 1) 
     If c = """" Then quoted = Not quoted 
     If c = d And Not quoted Then 
      A(k) = Mid(s, i, j - i) 
      k = k + 1 
      i = j + 1 
     End If 
    Next 
    If i < n Then 
     A(k) = Mid(s, i) 
    Else 
     k = k - 1 
    End If 
    ReDim Preserve A(k) 
    SmartSplit = A 
End Function 

В вашем примере - просто замените Split на SmartSplit и он должен работать ,