Werte aus einer TXT im Array laden...

  • VBScript

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

    Werte aus einer TXT im Array laden...

    Hallo VBS Experten,

    Im folgenden Beispiel möchte ich den Array durch eine TXT Datei erstezen.. Hat jemand eine Idee bzw. eine Lösung wie das funktionieren könnte.

    Interessanter Bereich:

    Visual Basic-Quellcode

    1. dim g_allowedKeys : g_allowedKeys = Array( _
    2. "Call_EditRightFile", _
    3. "Call_EditRightReg", _
    4. "Call_FIREWALLPORT_ADD", _
    5. "Call_FIREWALLPORT_DELETE", _
    6. "Call_FIREWALLPORT_DELETE2", _
    7. "Call_FIREWALLPROG_ADD", _
    8. "Call_FIREWALLPROG_DELETE", _
    9. "Call_FIREWALLPROG_DELETE2", _
    10. "CoCServiceUser")


    Der komplette Script:

    Visual Basic-Quellcode

    1. option Explicit
    2. const msiMessageTypeUser = &H03000000
    3. private sub StatusMessage(ice, kind, text)
    4. dim rec : set rec = Session.Installer.CreateRecord(1)
    5. rec.StringData(0) = ice & vbTab & kind & vbTab & text
    6. Session.Message msiMessageTypeUser, rec
    7. end Sub
    8. dim g_allowedKeys : g_allowedKeys = Array( _
    9. "Call_EditRightFile", _
    10. "Call_EditRightReg", _
    11. "Call_FIREWALLPORT_ADD", _
    12. "Call_FIREWALLPORT_DELETE", _
    13. "Call_FIREWALLPORT_DELETE2", _
    14. "Call_FIREWALLPROG_ADD", _
    15. "Call_FIREWALLPROG_DELETE", _
    16. "Call_FIREWALLPROG_DELETE2", _
    17. "CoCServiceUser")
    18. function ICE500()
    19. recInfo.StringData(0)="zCACallFileICE01" & Chr(9) & "3" & Chr(9) & "zCACallFileICE01 - Checks for duplicate GUIDs in Component table"
    20. Message &h03000000, recInfo
    21. 'Give creation data
    22. recInfo.StringData(0)="zCACallFileICE01" & Chr(9) & "3" & Chr(9) & "Created 05/21/98. Last Modified 10/08/98."
    23. Message &h03000000, recInfo
    24. ICE500 = 1
    25. dim dict : set dict = CreateObject("Scripting.Dictionary")
    26. dim key : for each key in g_allowedKeys
    27. dict(key) = True
    28. Next
    29. dim view : set view = Session.Database.OpenView("SELECT * FROM CustomAction")
    30. view.Execute
    31. dim rec : set rec = view.Fetch
    32. do while not (rec is nothing)
    33. if not dict.Exists(rec.StringData(1)) then
    34. StatusMessage "ICE500", 1, "Falscher Wert: Schlüssel '" & rec.StringData(1) &_
    35. "', Text '" & rec.StringData(2) & "'"
    36. end if
    37. set rec = view.Fetch
    38. loop
    39. end Function


    Danke schön!

    RE: Werte aus einer TXT im Array laden...

    Hallo morgenstern

    Wenn ich deine Frage richtig verstehe, möchtest du die Werte, welche im Array stehen, aus einer Text-Datei einlesen und direkt in das Dictionary-Objekt abfüllen.

    Ich würde das so machen:

    Visual Basic-Quellcode

    1. Dim dict
    2. Dim fso
    3. Dim file
    4. Dim inputline
    5. Set dict = CreateObject ("Scripting.Dictionary")
    6. Set fso = CreateObject ("Scripting.FileSystemObject")
    7. Set file = fso.OpenTextFile ("C:\Temp\Werte.txt", 1)
    8. Do While Not file.AtEndOfStream
    9. dict (file.ReadLine) = True
    10. Loop
    11. file.Close
    12. Set file = Nothing
    13. Set fso = Nothing


    Bitte schön. :)

    Im Gesamtkontext würds dann wie aussehen??

    Danke fbu!

    ich denke ich verstehe was du meinst.. aber wie kann ich den nun befüllten Array für meine Weiterverarbeitung verwenden?

    Etwa so (ich konnte es noch nicht erfolgreich ausführen..):

    Visual Basic-Quellcode

    1. Option Explicit
    2. Const msiMessageTypeUser = &H03000000
    3. Private Sub StatusMessage(ice, kind, Text)
    4. Dim rec : Set rec = Session.Installer.CreateRecord(1)
    5. rec.StringData(0) = ice & vbTab & kind & vbTab & Text
    6. Session.Message msiMessageTypeUser, rec
    7. End Sub
    8. Function ICE500()
    9. recInfo.StringData(0)="zCACallFileICE01" & Chr(9) & "3" & Chr(9) & "zCACallFileICE01 - Checks for duplicate GUIDs in Component table"
    10. Message &h03000000, recInfo
    11. 'Give creation data
    12. recInfo.StringData(0)="zCACallFileICE01" & Chr(9) & "3" & Chr(9) & "Created 05/21/98. Last Modified 10/08/98."
    13. Message &h03000000, recInfo
    14. ICE500 = 1
    15. Dim dict
    16. Dim fso
    17. Dim file
    18. Dim inputline
    19. Set dict = CreateObject ("Scripting.Dictionary")
    20. Set fso = CreateObject ("Scripting.FileSystemObject")
    21. Set file = fso.OpenTextFile ("C:\Temp\Daten.txt", 1)
    22. Do While Not file.AtEndOfStream
    23. dict (file.ReadLine) = True
    24. Loop
    25. file.Close
    26. Set file = Nothing
    27. Set fso = Nothing
    28. Dim view : Set view = Session.Database.OpenView("SELECT * FROM CustomAction")
    29. view.Execute
    30. Dim rec : Set rec = view.Fetch
    31. Do While Not (rec Is Nothing)
    32. If Not dict.Exists(rec.StringData(1)) Then
    33. StatusMessage "ICE500", 1, "Falscher Wert: Schlüssel '" & rec.StringData(1) &_
    34. "', Text '" & rec.StringData(2) & "'"
    35. End If
    36. Set rec = view.Fetch
    37. Loop
    38. End Function


    Und dann hätte ich da leider noch ne lästige Frage an dich :(. Ist es möglich nur einen bestimmten bereich aus der TXT Datei auszulesen.
    Bspw. Von ICE500Start bis ICE500Ende wenn die TXT Datei wie folgt aussehen würde:

    ICE500Start
    Hallo Leute
    Ich bin es...
    Wie gehts..
    ICE500Ende
    ICE501Start
    Ich bin 18 Jahre alt
    Ich lebe in Frankfurt
    ICE502Ende
    Ich meine, so wie du das Dict-Object verwendest, sollte das funktionieren. Was für einen Fehler erhälst du, wenn du diesen Code ausführen willst?

    Auch das begrenzte Einlesen ist kein Problem, jedoch etwas aufwändiger. Das würde dann so aussehen:

    Visual Basic-Quellcode

    1. Dim flgFound
    2. Dim strTemp
    3. flgFound = False
    4. Do While Not file.AtEndOfStream
    5. strTemp = file.ReadLine
    6. If Not flgFound Then
    7. If StrComp (strTemp, "ICE500Start") = 0 Then flgFound = True
    8. Else
    9. If StrComp (strTemp, "ICE500Ende") = 0 Then
    10. flgFound = False
    11. Else
    12. dict.Add strTemp, True
    13. End If
    14. End If
    15. Loop


    Dieser Code ist jetzt so auf die Schnelle aus dem Ärmel geschüttelt. Sollte aber funktionieren...