Mehrdimensionales dynamisches Array oder vielleicht eine andere Lösung?

  • VBScript

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Mehrdimensionales dynamisches Array oder vielleicht eine andere Lösung?

    Hallo zusammen,

    ich habe ein kleines Problem habe eine CSV Liste mit Werten wie z.B.

    a;xa
    a;xb
    a;xc
    b;ya
    b;yb
    c;za
    ....

    Ich will diese Liste einlesen und in Abhändigkeit setzten, sprich:

    a;xa;xb;xc
    b;ya;yb
    c;za

    Meine Idee war ein mehrdimensionales dynamisches Array welches unterschiedlich gefüllt wird (a=4 Werte, b=3 Werte, c=2 Werte). Da sich die CSV-Liste immer wieder ändern kann, müsste es ein dynamisches Array sein. Die Werte in der CSV-Liste sind nicht sortiert, dies hätte zu folge ich müsste das Array erst einmal an der ersten position durchlaufen (y-Richtung), ob der Wert bereits existiert und dann an der Array-Position (x-Richtung) das Ende ermitteln um weitere Werte eintragen zu können. Dabei müsste überprüft werden, ob das Array ggfs. Redimensioniert werden müsste. All das würde eine lange Laufzeit verursachen.

    Was ich genau damit erzwecken möchte ist, dass in einer HTA.-Datei zwei Dropdown Listen erscheinen und sobald ein Wert in einem der beiden Felder ausgewählt wurde, werden im anderen Dropdown-Feld nur noch die dazugehörigen Werte angezeigt. Sprich: wird im ersten Feld "a" ausgewählt, dann ist im zweiten Feld nur noch "xa;xb und xc" auswälbar. Wurde dagegen im zweiten Feld als erstes "ya" gewählt, dann kann im ersten Feld nur noch "b" ausgewählt werden.

    Hat jemand eine Idee für die Umsetzung?

    Für eure Hilfe und Ideen danke ich schon mal

    Schöne Grüße

    ?( Christoph

    Christoph1971 schrieb:

    Hat jemand eine Idee für die Umsetzung?

    EDIT: sorry ist ja nur vbs ... "schön" gehts halt nur mit .Net ;)

    dictionaries und listen sind dynamisch ...

    Visual Basic-Quellcode

    1. Dim dic As New Dictionary(Of String, List(Of String))
    2. Dim dummycsv() As String = {"a:1", "b:2", "a:3"}
    3. Dim spl() As String
    4. For Each s As String In dummycsv
    5. spl = Split(s, ":")
    6. If Not dic.ContainsKey(spl(0)) Then
    7. dic.Add(spl(0), New List(Of String))
    8. End If
    9. dic(spl(0)).Add(spl(1))
    10. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    Hi

    Ich würde dir auch das Dictionary empfehlen.
    Benötigst eigentlich auch kein Array im Dictionary Objekt.

    Ich würde es etwa so machen:

    Visual Basic-Quellcode

    1. Set d = CreateObject("Scripting.Dictionary")
    2. Str = Array("a;xa", "a;xb", "b;ya", "a;xc")
    3. For Each item In Str
    4. SplittedItem = Split(item,";")
    5. If d.exists(SplittedItem(0)) Then
    6. d.Item(SplittedItem(0)) = d.Item(SplittedItem(0)) & ";" & SplittedItem(1)
    7. Else
    8. d.add SplittedItem(0),SplittedItem(1)
    9. End If
    10. Next
    11. ke = d.keys
    12. it = d.items
    13. For a=0 To d.count-1
    14. WScript.Echo ke(a)
    15. WScript.Echo it(a)
    16. Next


    Nun kommts drauf an was du machen willst, du könntest die items(it) wieder splitten mit ";" als trennzeichen und hättest ein array aller zugehörigen werte.


    gruss mono
    Hi,

    Ich habe mal die List aus Vb.Net als Klasse für Vb Script geschrieben.
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Class List
    2. Public Property Get count
    3. count = interncount +1
    4. End Property
    5. Private InternCount
    6. Private Listarray
    7. Private Sub Class_Initialize()
    8. Interncount =-1
    9. Listarray = Array()
    10. End Sub
    11. Public Sub add(item)
    12. interncount = interncount +1
    13. ReDim Preserve Listarray(interncount)
    14. Listarray(interncount) = item
    15. End Sub
    16. Public Property Get item(index)
    17. If interncount >= index Then
    18. item = Listarray(index)
    19. Else
    20. Err.Raise 1,".item(" & index & ")","Error, index out of range: maximum index = " & interncount
    21. End If
    22. End Property
    23. Public Property Set item(index,val)
    24. If interncount >= index Then
    25. listarray(index) = val
    26. Else
    27. Err.Raise 1,".item(" & index & ")","Error, index out of range: maximum index = " & interncount
    28. End If
    29. End Property
    30. Function deleteAt(index)
    31. If index <= interncount Then
    32. For a=index To intercount-1
    33. listarray(a) = listarray(a+1)
    34. Next
    35. interncount = interncount -1
    36. ReDim Preserve listarray(interncount)
    37. Else
    38. Err.Raise 1,".item(" & index & ")","Error, index out of range: maximum index = " & interncount
    39. End If
    40. End Function
    41. Function sort
    42. If interncount > -1 Then
    43. Call QuickSort(listarray,0,interncount)
    44. else
    45. Err.Raise 2, ".sort", "Leere Liste kann nicht sortiert werden"
    46. end if
    47. End Function
    48. Private Function QuickSort( vntArray, intVon, intBis )
    49. Dim i, j
    50. Dim vntTestWert, intMitte, vntTemp
    51. If intVon < intBis Then
    52. intMitte = (intVon + intBis) \ 2
    53. vntTestWert = vntArray(intMitte)
    54. i = intVon
    55. j = intBis
    56. Do
    57. Do While UCase( vntArray(i) ) < Ucase( vntTestWert )
    58. i = i + 1
    59. Loop
    60. Do While UCase( vntArray(j) ) > Ucase( vntTestWert )
    61. j = j - 1
    62. Loop
    63. If i <= j Then
    64. vntTemp = vntArray(j)
    65. vntArray(j) = vntArray(i)
    66. vntArray(i) = vntTemp
    67. i = i + 1
    68. j = j - 1
    69. End If
    70. Loop Until i > j
    71. If j <= intMitte Then
    72. Call QuickSort(vntArray, intVon, j)
    73. Call QuickSort(vntArray, i, intBis)
    74. Else
    75. Call QuickSort(vntArray, i, intBis)
    76. Call QuickSort(vntArray, intVon, j)
    77. End If
    78. End If
    79. End Function
    80. End Class


    Aufruf:

    Visual Basic-Quellcode

    1. set MyList = New List
    2. 'Funktionen
    3. MyList.add("myStringItem")
    4. MyList.deleteAt(0)
    5. MyList.sort
    6. 'eigenschaften:
    7. Wscript.echo MyList.count
    8. Wscript.echo MyList.item(0)
    9. MyList.item(0) = "New StringItem"
    10. 'auf dein beispiel bezogen:
    11. Sub Main
    12. Set d = CreateObject("Scripting.Dictionary")
    13. Str = Array("a;a", "b;b", "b;a", "a;b")
    14. For Each item In Str
    15. SplittedItem = Split(item,";")
    16. If d.exists(SplittedItem(0)) Then
    17. d.Item(SplittedItem(0)).add(SplittedItem(1))
    18. Else
    19. Set Li = New List
    20. Li.add(SplittedItem(1))
    21. d.add SplittedItem(0), Li
    22. End If
    23. Next
    24. end sub


    Diese List könntest du als Item einem Dictionary Objekt zuweisen und dann die von Picoflop vorgeschlagene Methode benutzen.

    Gruss mono
    Das ist meine Signatur und sie wird wunderbar sein!