我有一个向服务器发送XMLHTTP请求的宏,它将得到的响应为纯文本字符串,而不是JSON格式字符串或其他标准格式(至少对于我所知道的) 。在Excel中解析字符串Vba
我想解析输出字符串,以访问数据以结构化的方式相同的方式为parseJson子程序在此link
我的问题是我不擅长使用正则表达式和我无法根据需要修改例行程序。
我需要解析的字符串具有以下结构:
- 该字符串是
- 每个单个参数是由它的参数定义的名称等于辛博尔,它的值,结束时用一个单一的线; “NID = 3;”或“SID =测试”;
- 参数可以在“结构”中收集,以符号|并以他们的名字后跟;如| STEST; NID = 3; SID = Test; |
- 的结构还可以含有其它的结构
一个输出串的一个例子是下面
|KC;|AD;PE=5;PF=3;|CD;PE=5;HP=test;|CD;PE=3;HP=abc;|
在这种情况下,存在一个宏结构KC含有结构AD一个。结构AD由参数PE,PF和2结构CD组成。而finaly结构CD有参数PE和HP
所以我想解析字符串,以获得对象/字典反映这种结构,你能帮帮我吗?
将第一答案
大家好后,感谢你的帮助,但我想我应该让更多的清楚,我想获得的输出。 对于我有,我想有以下结构的物体的例子字符串:
<KC>
<AD>
<PE>5</PE>
<PF>3</PF>
<CD>
<PE>5</PE>
<HP>test</HP>
</CD>
<CD>
<PE>3</PE>
<HP>abc</HP>
</CD>
</AD>
</KC>
于是我开始写了一个可能的工作代码基础上,从@Nvj回答一些提示,并在此答案link
Option Explicit
Option Base 1
Sub Test()
Dim strContent As String
Dim strState As String
Dim varOutput As Variant
strContent = "|KC;|AD;PE=5;PF=3;|CD;PE=5;HP=test;|CD;PE=3;HP=abc;|"
Call ParseString(strContent, varOutput, strState)
End Sub
Sub ParseString(ByVal strContent As String, varOutput As Variant, strState As String)
' strContent - source string
' varOutput - created object or array to be returned as result
' strState - Object|Array|Error depending on processing to be returned as state
Dim objTokens As Object
Dim lngTokenId As Long
Dim objRegEx As Object
Dim bMatched As Boolean
Set objTokens = CreateObject("Scripting.Dictionary")
lngTokenId = 0
Set objRegEx = CreateObject("VBScript.RegExp")
With objRegEx
.Global = True
.MultiLine = True
.IgnoreCase = True
.Pattern = "\|[A-Z]{2};" 'Pattern for the name of structures
Tokenize objTokens, objRegEx, strContent, lngTokenId, bMatched, "str"
.Pattern = "[A-Z]{2}=[^\|=;]+;" 'Pattern for parameters name and values
Tokenize objTokens, objRegEx, strContent, lngTokenId, bMatched, "par"
End With
End Sub
Sub Tokenize(objTokens, objRegEx, strContent, lngTokenId, bMatched, strType)
Dim strKey As String
Dim strKeyPar As String
Dim strKeyVal As String
Dim strWork As String
Dim strPar As String
Dim strVal As String
Dim strLevel As String
Dim strRes As String
Dim lngCopyIndex As Long
Dim objMatch As Object
strRes = ""
lngCopyIndex = 1
With objRegEx
For Each objMatch In .Execute(strContent)
If strType = "str" Then
bMatched = True
With objMatch
strWork = Replace(.Value, "|", "")
strWork = Replace(strWork, ";", "")
strLevel = get_Level(strWork)
strKey = "<" & lngTokenId & strLevel & strType & ">"
objTokens(strKey) = strWork
strRes = strRes & Mid(strContent, lngCopyIndex, .FirstIndex - lngCopyIndex + 1) & strKey
lngCopyIndex = .FirstIndex + .Length + 1
End With
lngTokenId = lngTokenId + 1
ElseIf strType = "par" Then
strKeyPar = "<" & lngTokenId & "par>"
strKeyVal = "<" & lngTokenId & "val>"
strKey = strKeyPar & strKeyVal
bMatched = True
With objMatch
strWork = Replace(.Value, ";", "")
strPar = Split(strWork, "=")(0)
strVal = Split(strWork, "=")(1)
objTokens(strKeyPar) = strPar
objTokens(strKeyVal) = strVal
strRes = strRes & Mid(strContent, lngCopyIndex, .FirstIndex - lngCopyIndex + 1) & strKey
lngCopyIndex = .FirstIndex + .Length + 1
End With
lngTokenId = lngTokenId + 2
End If
Next
strContent = strRes & Mid(strContent, lngCopyIndex, Len(strContent) - lngCopyIndex + 1)
End With
End Sub
Function get_Level(strInput As String) As String
Select Case strInput
Case "KC"
get_Level = "L1"
Case "AD"
get_Level = "L2"
Case "CD"
get_Level = "L3"
Case Else
MsgBox ("Error")
End
End Select
End Function
该函数创建与每个结构名称,参数名称和参数值的项目的字典作为该图所示 得益于功能get_Level
关联到结构小时项提供了一个应该有助于保留原始数据层次结构的级别。
所以我缺少的是一个函数来创建一个具有输入字符串的原始结构的对象。这是Retrieve
功能在这个答案link做什么,但我不知道如何适应我的情况
你能证明你的代码?你有多进步? – NavkarJ