通过使用字典为合并的字符串生成多参数

时间:2017-05-09 01:57:39

标签: vbscript

我试图找到一个更好的解决方案来集成字符串并生成一个具有参数最大值的新字段。 @AutomatedChaos helped me代码为{{3}}。但我需要一个更好的解决方案来实现代码的灵活性。

第一个字符串由*(星号)拆分,我想合并所有项目并创建一个具有最大值的新字符串。

fString = "projects@dnProjectsPatterning=0|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=1*projects@dnProjectsPatterning=1|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=0*projects@dnProjectsPatterning=5|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=2"

Set dict = CreateObject("Scripting.Dictionary")
Set re = New RegExp
re.Global = True
re.Pattern = "(\w+)=(\d+)"

Set matches = re.Execute(fString)
For Each match In matches
    key = match.Submatches(0)
    value = CInt(match.Submatches(1))
    If dict.Exists(key) Then
        If value < dict.Item(key) then
            value = dict.Item(key)
        End If
    End If
    dict.Item(key) = value 
Next

For Each key In dict
    MsgBox key & "=" & dict.Item(key)
Next

' output:
' dnProjectsPatterning=5
' dnProjectsSendReport=3
' dnWorkplansAdd=1
' dnWorkplansGrouping=2

我想生成这个字符串:

newString = "projects@dnProjectsPatterning=5|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=2"

请注意,对于projects@workplans@,这两者会被#拆分。

2 个答案:

答案 0 :(得分:3)

这是另一个可以工作的示例如果参数总是如图所示排序。

以下代码仅将除*之外的所有分隔符视为键的一部分。您可以查看this regexr shot以了解该模式的工作原理。

fString = "projects@dnProjectsPatterning=0|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=1*projects@dnProjectsPatterning=1|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=0*projects@dnProjectsPatterning=5|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=2"

Set params = CreateObject("Scripting.Dictionary")
With (New RegExp)
    .Global = True
    .Pattern = "([^=*]*)=(\d+)"
    For Each match In .Execute(fString)
        key = match.Submatches(0)
        val = match.Submatches(1)
        If params.Exists(key) Then
            If val > params(key) Then params(key) = val
        Else
            params.Add key, val
        End If
    Next
End With

'temporary str dictionary to generate string
Set str = CreateObject("Scripting.Dictionary")
For Each key In params
    'prepend key + "=" into items to generate merged string
    str.Add key, key & "=" & params(key)
Next
newString = Join(str.Items, "") 'joining items
WScript.Echo newString

'normalize params' keys
For Each key In params
    If Left(key, 1) = "|" Or Left(key, 1) = "#" Then
        params.Key(key) = Mid(key, 2)
    End If
Next

'lookup for `dnProjectsSendReport` parameter

WScript.Echo params("dnProjectsSendReport") 'must print 3

答案 1 :(得分:0)

我找到了解决方案:

'target = "projects@param1={param1}|param2={param2}#workplans@param3={param3}|param4={param4}..."
f_AccessArray = "projects@dnProjectsPatterning=0|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=1*projects@dnProjectsPatterning=1|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=0*projects@dnProjectsPatterning=5|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=2"
arrAccessPack = Split(f_AccessArray,"*")
endString = Split(arrAccessPack(0),"#")
nArrString = ""
for i = 0 to UBound(endString)
    if i < UBound(endString) then strHash = "#" else strHash = ""
    part1 = Split(endString(i),"@")(0)
    part2 = Split(Split(endString(i),"@")(1),"|")
    newParams = ""
    for j = 0 to UBound(part2)
        if j < UBound(part2) then strPipe = "|" else strPipe = ""
        param = Split(part2(j),"=")(0)
        newParams = newParams & param&"={"&param&"}" & strPipe
    next
    nArrString = nArrString & part1&"@"&newParams & strHash
next
MergeAccessArray = MergerParams(f_AccessArray,nArrString)


Function MergerParams(fStr,fTarget)

Set dict = CreateObject("Scripting.Dictionary")
Set re = New RegExp
re.Global = True
re.Pattern = "(\w+)=(\d+)"

Set matches = re.Execute(fStr)
for each match in matches
    key = match.Submatches(0)
    value = cint(match.Submatches(1))
    If dict.Exists(key) Then
        If value < dict.Item(key) then
            value = dict.Item(key)
        End If
    End If
    dict.Item(key) = value
next

target = fTarget
for each key in dict
    target = Replace(target, "{" & key & "}", dict.Item(key))
Next
MergerParams = target

End Function