Mehrspaltiges Array in einer Zeile schreiben

  • Hallo zusammen,

    ich beschäftige mich nun seit ein paar Tagen mit AutoIT und komme irgendwie nicht mehr weiter

    Ich würde gerne ein kleines Programm schreiben welches eine Textdatei erstellt, ander Datein auslist und anschließend Teile aus diesen Datein in die selbsterstellte Textdatei schreibt.

    Dabei bin ich soweit das ich die Textdatei erstellen und beschreiben kann sowie mit "_StringBetween" auch die von mir geforderten Informationen aus einer anderen Datei auslesen kann.
    Jedoch bekomme ich Probleme sobald ich diese in der von mir erstellten Textdatei speichern möchte.

    Wenn ich die drei Textteile einzeln auslese und direkt einzeln in die neue Textdatei schreibe funktioniert es -> Leider wird dabei jedoch bei jedem Eintrag eine neue Zeile angefangen was nicht von mir gewollt ist.

    Dies sieht dann in etwa so aus:

    TexteilA
    TexteilB
    TexteilC


    Am Ende sollte es aber eigentlich so aussehen:

    TexteilA | TexteilB | TexteilC


    Wenn ich versuche die drei Textteile einzeln auszulesen und anschließend versuche das ganze Array in die Textdatei zu schreiben erhalte ich leider nachfolgenden Fehlerbericht:

    AutoIt Error:
    Line 7306 (File"C:\...\test.exe"):
    Error: Subscript used on non-accessible variable


    Im Spoiler unter diesem Text habe ich mal meinen Code eingefügt und hoffe das mir jemand von euch auf die Sprünge helfen kann warum mein Programm nicht so funktioniert wie es soll.

    Spoiler anzeigen
  • Hallo @erBBga,

    Das kann man einfach mit einer Schleife machen.
    Aber wahrscheinlich genügt dir schon _ArrayToString (klingt auch genau danach, was du willst :) ).
    Ausschnitt aus dem Hilfebeispiel:

    AutoIt
    #include <Array.au3>
    #include <MsgBoxConstants.au3>
    
    
    Local $aArray[20]
    For $i = 0 To 19
        $aArray[$i] = $i
    Next
    _ArrayDisplay($aArray, "1D Array")
    MsgBox($MB_SYSTEMMODAL, "Items 1-7", _ArrayToString($aArray, @TAB, 1, 7))

    Grüße autoiter

  • Vielen Dank für die Schnelle Antwort @autoiter

    Ich glaube es jetzt verstanden zu haben und habe meinen Code nochmal angepasst... leider bekomme ich jedoch noch immer Probleme mit dem Array... ich vermute mal das ich gerade ein Brett vorm Kopf habe. :Face:
    Könntet ihr wohlmöglich nochmal mit schauen was ich die ganze Zeit falsch mache?

    Als error erhalte ich die ganze Zeit:

    C:\Users\....\test4.au3" (52) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    If $aArray[0][2] = "geschrieben" Then
    If ^ ERROR
    >Exit code: 1 Time: 0.3565

    Spoiler anzeigen
  • Hmm, ich habe das jetzt nicht getestet. Allerdings scheint mir dein Vorgehen schon daneben. Im Erfolgsfall gibt _StringBetween ein Array zurück. Das speicherst du hier z.B. in $aArray[0][2]
    Local $aArray[0][2] = _StringBetween($string, $beginn3, $ende3)
    Damit ist $aArray[0][2] mit einem Array im Array belegt. Auf einen Wert in dem Array kannst du nicht einfach mit
    If $aArray[0][2] = "geschrieben" Then zugreifen.
    Du musst außerdem mal ein wenig auf Fehler prüfen.
    Schreibe unter dieser Zeile mal
    Local $aArray[0][2] = _StringBetween($string, $beginn3, $ende3)
    folgendes:If @error Then MsgBox(0, "Fehler", @error)
    Wenn in der Messagebox eine 1 steht, war dein vorheriger Aufruf von _StringBetween nicht erfolgreich. Folglich kannst du auch nicht auf $aArray[0][2] zugreifen und musst das ausschließen.

    Grüße autoiter

  • Ich habe mal je der StringBetween mit _ArrayDisplay($aArray, "Arrays") abgefragt und habe schon mal feststellen können das die 3 Abfragen die Richtigen Werte in das Array schreiben.

    Anschließend habe ich wie von dir beschrieben die "If @error..." Zeile eingefügt und habe das Programm nochmal ausgeführt -> Diesmal hat er in der Messagebox eine "-1" geschrieben.

    Wäre dies die erwartete "1"?

    Wie würde man denn eine solche Abfrage als erfahrener AutoIT-Programmierer lösen?

  • Hehe, gerade fällt es mir auf.
    Wir hatten wohl beide ein Brett vor dem Kopf :D

    Lass mal nach Local $aArray[0][3] das Local weg und schreibe auch in der Zeile $aArray[1][3].
    Danach weise die Werte wie bisher zu. Allerdings ohne Local..

    Grüße autoiter

  • Vielen Dank - Nun gibt es auch keine Fehlermeldung mehr.

    Jedoch scheinen die Werte dennoch nicht richtig übertragen zu werden - obwohl sie im string richtig abgefragt werden. ?(


    Der Code sieht mit den Änderungen dann wie folgt aus... hatte ich es so richtig verstanden?

  • Ja, das Array mach nun keine Probleme mehr. Allerdings kannst du die Werte nicht so auslesen wie du möchtest. Schau dir nochmal Beitrag 4 hier an.
    _StringBetween gibt keinen String sondern ein Array aus.
    Je nachdem, wie viele Treffer du hast, hat dieses Array mehr oder weniger Elemente.
    Speichere die Daten besser in einem anderen Array, auf das du dann zugreifst. Das ist sicher einfacher für dich. Ich gehe mal davon aus, du hast jeweils nur einen Treffer. Dann sieht das für jedes _StringBetween so aus:

    AutoIt
    Local $aStringBetween = _StringBetween($string, $beginn2, $ende2)
    If IsArray($aStringBetween ) Then _ArrayDisplay($aStringBetween) ; <== Damit kannst du dir das Ergebnis von _StringBetween ansehen.
    
    
    ; Bsp. die Zuweisung zu $aArray[0][1]
    $aArray[0][1] = $aStringBetween[0] ; Der erste Treffer

    Grüße autoiter

  • Jetzt hat es mit dem Array geklappt!! Vielen Dank :klatschen:


    Mit der Funktion "_ArrayDisplay($aArray, "Arrays")" zeigt er mir nun auch wie gewollt nachfolgendes an:


    [0] 12:00 Beispielsatz 1


    Und mit der "_FileWriteFromArray" Funktion schreibt er es auch wunderbar wie gewollt in die Textdatei. :party:

    Für den schnellen und ausührlichen Support noch einmal ein DICKES

    DANK!! :klatschen:

    ich wünsche dann noch einen schönen Abend...

  • Hallo @erBBga,
    weil du dich so nett bedankt hast, möchte ich dich warnen.
    Falls du es in etwa so gemacht, wie ich vorgeschlagen habe und nun etwa so einen String in deinem $aArray speicherst:
    $aArray[0][1] = $aStringBetween[0] solltest du unbedingt Fehler prüfen, da sonst die gleichen Abstürze passieren, wie du es in Beitrag 3 beschrieben hast. Also wenn _StringBetween nicht erfolgreich war, gibt es kein Array zurück. Folglich gibt es auch kein erstes Element in diesem Array. Wenn du dann das erste mal mit $aStringBetween[0] arbeiten willst, stürzt das Skript ab, weil du auf ein Element zugreifst, dass es nicht gibt. Das kann schnell passieren, wenn du nicht, wie in deinem Bsp. sicher weißt, ob etwas in einem Text zu finden ist.

    Das unten soll nur beispielhaft die Methoden zeigen. Man kann sie sicherlich intelligenter anwenden :)

    Grüße autoiter