Daten aus einer Text Datei in ein Array einlesen

  • VBScript

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von AngelOfDeath.

    Daten aus einer Text Datei in ein Array einlesen

    Hallo zusammen, bin am verzweifeln!
    Ich habe mir dieses Script gebastelt, um Daten aus einer .txt Datei in ein Array einzulesen um damit später weiter zu arbeiten.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim FS0, DateiInhalte, Inhalt, i, hallo
    3. Dim Feiertage(100)
    4. Const txtName = "C:\Users\Admin\Desktop\VB Datums_Rechner\Feiertage.txt"
    5. Set FS0 = CreateObject("Scripting.FileSystemObject")
    6. 'Existiert die Datei
    7. If FS0.FileExists(txtName) then
    8. Set DateiInhalte = FS0.OpenTextFile(txtName)
    9. Inhalt = DateiInhalte.ReadAll
    10. For i = 0 To 6 'befüllen des Arrays aus der TextDatei
    11. Feiertage(i) = Split(Inhalt, ";")
    12. Next
    13. Else
    14. WScript.Echo "Datei " & txtName & " nicht gefunden!"
    15. End If
    16. hallo = Feiertage(1)
    17. WScript.Echo "Dies ist ein Feiertag" & hallo


    Ich würde mir jetzt gerne anzeigen lassen, was in den einzelnen Array-Feldern steht, um sicher zu gehen, dass auch wirklich alles eingelesen wurde.
    Bekomme allerdings immer wieder Fehler: 23,1 Laufzeitfehler; Typen unverträglich

    Inhalt = DateiInhalte.ReadAll
    For i = 0 To 6 'befüllen des Arrays aus der TextDatei
    Feiertage(i) = Split(Inhalt, ";")
    Next

    das kommt mir auch nicht wirklich richtig vor, die Items 0-6 werden jeweils mit dem gleichen Wert befüllt und zwar mit einem Array vom Typ String, welcher die gesamte Textdatei darstellt, welche bei Semikolon gesplittet wurde...
    Ich kann zwar nichts über das Dateiformat an sich sagen, aber müsste es nicht eher so sein?:

    Visual Basic-Quellcode

    1. Feiertage = Split(Inhalt,";")

    natürlich dann ohne Schleife, sollte dies Aufgrund der festen Arraybegrenzung nicht gehen, so sollte dies möglich sein:

    Visual Basic-Quellcode

    1. Dim tmpFeiertage
    2. tmpFeiertage = Split(Inhalt,";")
    3. 'und hier noch alle Items durchlaufen und einzeln bis zum Maximum festlegen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Neues Problem selbes Script, ich habe jetzt deine änderungen vorgenommen, allerdings habe ich mitlerweile das Problem, dass wenn ich versuche das ganze ein wenig dynamischer zu gestalten, er die Datensätze nicht mehr einliest.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim FS0, DateiInhalte, Inhalt, i, Trenner, Datum, Bedingung
    3. Dim Feiertage(100)
    4. Const txtName = "C:\Users\Admin\Desktop\VB Datums_Rechner\Feiertage.txt"
    5. Set FS0 = CreateObject("Scripting.FileSystemObject")
    6. ' Existiert die Datei?
    7. If FS0.FileExists(txtName) then
    8. Set DateiInhalte = FS0.OpenTextFile(txtName)
    9. Inhalt = DateiInhalte.ReadAll
    10. Trenner = Split(Inhalt, ";")
    11. Else
    12. WScript.Echo "Datei " & txtName & " nicht gefunden!"
    13. End If
    14. 'befüllen des Arrays aus der TextDatei
    15. Do Until DateiInhalte.atEndOfStream
    16. For i = 0 to 100
    17. Feiertage(i) = Trenner(i)
    18. Next
    19. Loop
    20. ' Überprüft ob heute ein Feiertag ist
    21. Datum = Date()
    22. Bedingung = False
    23. Do
    24. For i = 0 to 100
    25. If Datum = Feiertage(i) then
    26. Bedingung = True
    27. If Bedingung = True then
    28. Exit For
    29. End If
    30. End If
    31. Next
    32. Loop Until Bedingung = True or i = 100
    Do Until DateiInhalte.atEndOfStream
    weg mit dieser Schleife, das ist vollkommener Quatsch, da ReadAll bereits die Gesamte Textdatei ausliest...

    Do
    [...]
    Loop Until Bedingung = True or i = 100

    diese ist ebenfalls völliger Quatsch, da dies bereits überprüft wird(durch Exit For und i wird dank der For Schleife niemals größer 100 werden...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hmm, wenn ich die beiden Do Loop Schleifen weg nehme, bekomme ich den Fehler: 21,2 Index außerhalb des gültigen Bereichs: '12'
    Liegt wohl daran, dass dann hier

    Visual Basic-Quellcode

    1. For i = 0 to 100
    2. Feiertage(i) = Trenner(i)
    3. Next

    der Zähler zu hoch läuft und die Variable Trenner dann leer abgefragt werden soll.


    mein Problem ist eigentlich mehr, dass ich nicht weiß, wie ich rausfinde welche Anzahl von Splits gemacht wurden. Ich hab hier mal schnell eine stark vereinfachte Version zusammen gebastelt, bei der allerdings wiedermal die Anzahl der Splits fehlt und ich zudem, wenn ich den Zähler manuell einstellen immer 0 erhalte, egal ob das heutige Datum darin vorhanden ist oder nicht.

    Visual Basic-Quellcode

    1. If FS0.FileExists(txtName) then
    2. Set DateiInhalte = FS0.OpenTextFile(txtName)
    3. Inhalt = DateiInhalte.ReadAll
    4. Trenner = Split(Inhalt, ";")
    5. Else
    6. WScript.Echo "Datei " & txtName & " nicht gefunden!"
    7. End If
    8. For i = 0 to 10
    9. If Date() = Trenner(i) then
    10. Bedingung = True
    11. If Bedingung = True then
    12. Exit For
    13. End If
    14. Else Bedingung = False
    15. End If
    16. Next
    17. WScript.Echo Bedingung

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

    Ich habe alle Probleme Lösen können, doch an dieser stelle:

    Visual Basic-Quellcode

    1. For i = 0 to 10
    2. If CStr(Date()) = Trenner(i) then
    3. 'blablubber
    4. Next

    Habe ich das Problem, dass das Ende meiner Zählvariable statisch ist und ich damit jedes mal, wenn neue Einträge in die .txt Datei kommen den Zähler daran anpassen müsste.

    Es muss doch die Möglichkeit geben, herrauszufinden, in wie viele Strings "Split" meinen Inhalt der .txt Datei zerlegt.

    Das Problem mit dem vergleichen habe ich einfach mit

    Visual Basic-Quellcode

    1. CStr(Date()) = Trenner(i)

    gelöst, aber das eigentliche Problem ist das oben beschriebene

    Edit: Also ich habe es jetzt einfach so gelöst, dass ich alle Zeichen Zähle und dann durch die Länge der einzelnen Strings teile, da diese ja glücklicherweise alle gleichlang sind.
    Allerdings kann das bestimmt nicht die optimale Lösung sein.

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