splitvbscriptinstr

VBScript - Spliting a String with 2 target chars, turning them in composite Array and then removing those unnecessary from the array


I have a question that could be easy or not.

I will explain further: I have a string like this:

str = "TR~Maintenance~fas plus-maintenicon|GR~Supplies~fas minus-suppicon|JK~Affidavit~fas minus-affiicon"

Now, my objective is to put those in an array separately like:

TR
Maintenance
fas plus-maintenicon
GR
Supplies
fas minus-suppicon
JK
Affidavit
fas minus-affiicon

and then reshape and redim the array to keep only, let's say, the strings starting with fas....

What is the easiest method? Spliting? regEx? inStr?

I have the following code:

Function funcSeparaLista(objLst)
    arrVLst = split(objLst, "~")
    
    for each x in arrVLst
        VLst = VLst&x&"<br/>"
    next
        
    funcSeparaLista = split(VLst, "|")
end function

t = funcSeparaLista(str)

But retrieving the data using:

response.write(t(0))
response.write(t(1))
response.write(t(2))
response.write(t(3))

I get undesired results:

TR
Maintenance
fas plus-mainteniconGR
Supplies
fas minus-suppiconJK
Affidavit
fas minus-affiicon

One thing most important: I want my FUNCTION only to deal with putting the detached string in arrays and dealing with it after in another portion of code.

After the array hold everything like I want it, I want only the array to keep this data:

fas plus-maintenicon
fas minus-suppicon
fas minus-affiicon

What I am doing wrong? Remember please. This is vbscript, not VB.Net. Thanks in advance I think this could be very easy but I am not quite trying to accomplish it after some hours redoing and checking code.


Solution

  • This is a serialised string where the record delimiter is | and the field delimiter is ~. You can easily build a 2-Dimensional Array from this using a double loop.

    Dim str: str = "TR~Maintenance~fas plus-maintenicon|GR~Supplies~fas minus-suppicon|JK~Affidavit~fas minus-affiicon"
    
    Dim data: data = ConvertToArray(str, "|", "~")
    WScript.Echo data(1, 2)
    
    Function ConvertToArray(value, record_delim, field_delim)
        Dim data()
        If Len(value) < 1 Then ConvertToArray = Empty
        Dim records: records = Split(value, record_delim)
        If Not IsArray(records) Then ConvertToArray = Empty
        Dim rows: rows = UBound(records)
        Dim row, col
        For row = 0 To rows
            Dim fields: fields = Split(records(row), field_delim)
            If Not IsArray(fields) Then ConvertToArray = Empty
            Dim cols: cols = UBound(fields)
            ReDim Preserve data(cols, row)
            For col = 0 To cols
                data(col, row) = fields(col)
            Next
        Next
        ConvertToArray = data
    End Function
    

    Output:

    Affidavit
    

    Using this function you can get the output you require by looping through and returning just the 3rd column from each row.

    Dim data: data = ConvertToArray(str, "|", "~")
    If IsArray(data) Then
        Dim row
        Dim rows: rows = UBound(data, 2)
        For row = 0 To rows
            WScript.Echo data(2, row)
        Next
    End If
    

    Output:

    fas plus-maintenicon
    fas minus-suppicon
    fas minus-affiicon