У меня есть макрос, который отправляет XMLHTTP-запрос на сервер и получает в качестве ответа строку простой текст строку, а не строку формата JSON или другие стандартные форматы (по крайней мере, для того, что я знаю) ,Разбор строки в Excel Vba
Я хотел бы разобрать строку вывода для того, чтобы получить доступ к данным в структурированном подходе таким же образом, как подпрограммой parseJson в этом link
Моя проблема в том я не очень хорошо с регулярными выражениями и Я не могу изменить процедуру для своих нужд.
Строка, мне нужно, чтобы разобрать имеет следующую структуру:
- Строка представляет собой одну строку
- Каждый отдельный параметр определяется его параметром имя равное Simbol, его значение и заканчивая; "NID = 3;" или «SID = Test;»
- Параметр может быть собран в «структурах» начинается и заканчивается символом | и они идентифицируются с их именем, за которым следует; таких как | 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. И, наконец структур CD имеют параметры PE и HP
Так что я хотел бы разобрать строку, чтобы получить в Object/Словарь, который отражает эту структуру, вы можете мне помочь?
добавляет после того, как первые ответы
Привет всем, спасибо за вашу помощь, но я думаю, что я должен сделать более ясным вывод, что я хотел бы получить. Для примера строки, у меня есть, я хотел бы иметь объект со следующей структурой:
<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
элементы, связанные со структурами ч ave уровень, который должен помочь сохранить исходную иерархию данных.
Так что я отсутствую - это функция для создания объекта, который имеет исходную структуру входной строки. Это то, что функция Retrieve
делать в этом ответе link, но я не знаю, как адаптировать его к моему делу
Можете ли вы показать код? Как далеко вы продвинулись? – NavkarJ