2015-11-07 63 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 

在你的榜样 - 只需更换由SmartSplitSplit它应该工作。

相关问题