Variable in Array-Namen möglich?

  • Liebe AutoIt-Profis,

    ist es möglich, eine Variable innerhalb eines Array-Namens zu benutzen (wie in VBA) ? Um z.B. mit _ArrayAdd($A_Array[$x], ...) in einem For-Next-Schleifendurchlauf Daten in $Array1, $Array2, $Array3, usw. zu speichern?
    Oder gibt es außer "If $x = 1 Then _ArrayAdd($Array1, ...) eine kürze / elegantere Variante? Ich bin bei meiner Suche auf "Assign" gestoßen, aber da werden ja Arrays explizit ausgenommen ...

    Ich bitte wie immer um Nachsicht, ich scripte nur sehr selten in AutoIt.


    Gruß Kilo

  • Hi :)

    Wenns nur mit Zahlen zugegriffen werden soll: Nen 2D-Array

    Wenns auch mit andere Variablentypen gehen soll: Maps

    Beides in dem Beispiel hier:

    Lg, Kanashius

  • Hallo Kanashius,

    vielen Dank für die Antwort! Auf die Idee, es mit einem mehrdimensionalen Array zu lösen, bin ich auch schon gekommen

    - allerdings wirft das für mich als Nicht-Profi direkt die nächsten Probleme auf ... Wenn ich mit "_ArrayAddd" arbeite, weiß

    ich nicht, wie ich die "Leerzeilen" (siehe Bild) vermeide bzw. nachträglich lösche und es fehlt mir der Wert für die Anzahl der

    Zeileneinträge in der "0-Zeile".

    Das Map-Beispiel habe ich schlichtweg nicht verstanden und es wirft bei mir auch einen Fehler aus ("Local $mData[^ ERROR")

    Gruß Kilo

  • Guten Morgen Oskar,

    ich lese (PDF) Rechnungen mit PDFtoText ein und durchsuche die txt-Datei mittels "_FileReadToArray" und "StringInStr" auf die Schlagworte "Bestelldatum, Bezahldatum und Summe".

    Das klappt soweit auch wirklich prima. Nun möchte ich die Daten für die drei Kriterien entweder in drei unterschiedlichen Arrays oder in einem mehrdimensionalen Array speichern.

    Bei Verwendung eines 2d-Arrays stoße ich auf mein Problem wie im Beitrag #3. Bei einzelnen Arrays würde ich diese gerne mit einer Variablen gem. des Schleifendurchlaufs ansprechen

    Spoiler anzeigen
    Code
    #include <Array.au3>
    Local $A_Array1,$A_Array2,$A_Array3
    
    For $x = 0 To 3
        _ArrayAdd($A_Array[$x],"Testwert")
    Next
    
    _ArrayDisplay($A_Array1)[tt][/tt]

    Aber so klappt das natürlich nicht ...

    Alternativ löse ich es derzeit so

    Spoiler anzeigen

    #include <Array.au3>

    Local $A_Array1[1],$A_Array2[1],$A_Array3[1]

    For $x = 1 To 3

    If $x = 1 Then _ArrayAdd($A_Array1,"Bezahlt am ... (Beispiel)")

    If $x = 2 Then _ArrayAdd($A_Array2,"Bestellt am ... (Beispiel)")

    If $x = 3 Then _ArrayAdd($A_Array3,"Preis ... (Beispiel)")

    Next

    If IsArray($A_Array1) Then $A_Array1[0] = UBound($A_Array1) - 1

    If IsArray($A_Array2) Then $A_Array2[0] = UBound($A_Array2) - 1

    If IsArray($A_Array3) Then $A_Array3[0] = UBound($A_Array3) - 1

    _ArrayDisplay($A_Array1,'Bezahlt')

    _ArrayDisplay($A_Array2,'Bestellt')

    _ArrayDisplay($A_Array3,'Preis')

    und ich würde gerne so etwas wie _ArrayAdd($A_Array[$x], ...) sprich: eine "Variable innerhalb einer Variablen oder eines Namens" benutzen - sofern das FÜR MICH lösbar ist!

    Bei "Checkboxen" habe ich das bereits erfogreich geschafft.

    LG Kilo

    Einmal editiert, zuletzt von kilo (2. Oktober 2023 um 09:49)

  • @kilo : In jeder Spalte hast du ja die gleiche Anzahl an Zeilen, sprich nocrmalerweise machst du das dann so:

    AutoIt
    $arData[0][0] = Ubound($arData, $UBOUND_ROWS) - 1 ;Für die Anzahl der Zeilen, da $UBOUND_ROWS der Defaultwert ist, könntest du ihn auch weglassen
    $arData[0][1] = Ubound($arData, $$UBOUND_COLUMNS) - 1 ;Für die Anzahl der Spalten (falls gewünscht)

    Wegen deiner Testwerte: Die sollten bestimmt alle in Spalte 1, richtig?

    Ich hänge dir mal ein Beispiel an (Achtung, das ich hier copy/paste gemacht habe, anstatt eine Funktion zu nutzen ist nur zu Darstellungs/Verständniszwecken!):

  • #include <Array.au3>

    global $_array [500]

    For $i = 1 To 100

    $_array [$i] = 22+$i

    Next

    _ArrayDisplay ($_array)

    Ist möglich....

    Gut kommt zu spät...nach #4 nicht reingeschaut...

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Dann hast du aber zig Leerzeilen, die der TE aber (verständlicherweise) nicht möchte (wenn ichs richtig verstanden habe).

    Daher mein Lösungsangebot das beim Einlesen dyn. zu erweitern wobei das sicherlich nnoch besser geht aber das war jetzt Q&D.

  • Hallo Moombas,

    auch Dir herzlichen Dank für die Antwort! Vielleicht wird durch meinen Beitrag #5 etwas deutlicher, was ich möchte.

    DIe Testwerte sollen nicht in alle in die erste Spalte, das es sich um unterschiedliche Daten handelt (2 Datumswerte und einen €-Wert)

    LG Kilo

  • Wo ist das Problem.... due findest den Begriff Zahldatum....den Du im Pdf suchst.... liest danach einige Zeichen ein und prüfst ob das ein Datum sein könnte und dann willst Du den Wert abspeichern. Gleiches gilt für die anderen Werte. Wiso machst Du das so kompliziert?

    Schreib doch das ganze jeweils in eine Variable z.B. $_zahldatum, $_rechnungsbetrag, $_zahlbetrag usw.

    Im weiteren Verlauf musst Du mit den Zahlen ja doch etwas anfangen - Du extrahierst ja nicht weil man die Angaben nicht lesen kann :) Also brauchst Du Übergabeparameter an die Fibu.... z.B. Ein *.txt File deren Aufbau ist für den Import in Fibus (dort) als Datensatzbeschreibung hinterlegt.

    Dazu ist es doch vollkommen egal wo die Daten im Source stehen?

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Moombas,

    auch Dir herzlichen Dank für die Antwort! Vielleicht wird durch meinen Beitrag #5 etwas deutlicher, was ich möchte.

    DIe Testwerte sollen nicht in alle in die erste Spalte, das es sich um unterschiedliche Daten handelt (2 Datumswerte und einen €-Wert)

    LG Kilo

    Ich hätte das dennoch so verstanden:

    Einmal editiert, zuletzt von Moombas (2. Oktober 2023 um 10:12)

  • Hallo Peter,

    danke für Deine Antwort. Wenn man Profi ist, ist alles kein Problem ... wenn nicht dann ggf. schon!

    Zitat

    ... findest den Begriff Zahldatum....den Du im Pdf suchst.... liest danach einige Zeichen ein und prüfst ob das ein Datum sein könnte ...

    Genauso mache ich es!

    Ich kann aber nicht EINE Variable benutzen, weil z.B. Beträge in der Rechnung mehrfach vorkommen und ich trotz "Begriffssuche" (Summe, Betrag, Preis ...)

    UND RegEX ("\d+\,\d{2}") manchmal auch Brutto, Netto, MwSt - Beträge erwische. Insofern dachte ich mir, speichere alle gefundenen Beträge in einem Array,

    sortiere es absteigend und mit sehr großer Wahrscheinlichkeit ist der größte Wert der von mir gesuchte ... das fand ICH einfach.

    Zitat

    ... und ich würde gerne so etwas wie _ArrayAdd($A_Array[$x], ...) sprich: eine "Variable innerhalb einer Variablen oder eines Namens" benutzen - sofern das FÜR MICH lösbar ist!

    Bei "Checkboxen" habe ich das bereits erfogreich geschafft.

    2 Mal editiert, zuletzt von kilo (2. Oktober 2023 um 10:17)

  • Moin,

    Ich kann aber nicht EINE Variable benutzen, weil z.B. Beträge in der Rechnung mehrfach vorkommen und ich trotz "Begriffssuche" (Summe, Betrag, Preis ...)

    UND RegEX ("\d+\,\d{2}") manchmal auch Brutto, Netto, MwSt - Beträge erwische. Insofern dachte ich mir, speichere alle gefundenen Beträge in einem Array,

    sortiere es absteigend und mit sehr großer Wahrscheinlichkeit ist der größte Wert der von mir gesuchte ... das fand ICH einfach.

    Ich verstehe das so, dass Du nur einen Betrag suchst und versuchst, den über eine Sortierung eines Arrays zu bestimmen. Ist das zutreffend?

    Wenn ja, finde ICH das nicht einfach. Du solltest dann mal ein Beispiel Deiner Daten zeigen und beschreiben, wie die verarbeitet werden sollen.

  • Wie so oft endet ein Thread im Kaffeesatzlesen.

    Du wirst den ausgelesenen Text doch sicherlich anonymisierten können und hier hochladen können?

    Dann erst kann man wirklich zielgerichtete Lösungen erarbeiten.

    So endet das nur in einem quälenden Gehangel von einem Informationsfetzen zum nächsten und eine Lösung, welche einem Optimum nahekommt wirst du so nicht erhalten können.

    Mir persönlich ist es ein Rätsel wie man aufgrund der bisher präsentierten Informationslage schon irgendwelche "Lösungen" präsentierten kann.

  • AspirinJunkie : Indem man dazu Lösungen präsentiert, wo es aktuell noch egal wäre wie er die Daten bekommt ;) Den teil habe ich pers. erstmal komplett übersprungen da ich mir dazu auch bisher keinen Reim machen konnte aber beim Erstellen/Füllen des 2D Arrays mit den entsprechend vorliegenden Daten schon.

    Aber um das Erfassen/Auslesen der Daten wirklich machen zu können, muss (wie von dir und Velted gefordert) ein Beispiel String/PDF (whatever) geliefert werden. Sonst ist ja jede Hilfe ein vermeintlicher Schuss ins Blaue ;)

  • Moombas

    Das war als Beispiel zum weiterdenken gedacht.. niemand hat gesagt er dürfe das nicht mit einem 2 D Array machen. Und niemand hat verboten, das Array kleiner und größer zu machen oder die Anzahl von $_i nach array[0] zu schreiben usw...usw.

    Im übrigen würde ich das so gar nicht lösen, denn irgendwo sollen die Daten ja weiterverarbeitet werden, ergo braucht es am Ende doch ein "Exportformat". Auch wenn der TE uns freundlicherweise nicht verraten hat wozu er das so aufwändig speichern will.

    Also entweder in eine Datenbank oder in eine TXT Datei mit Trennzeichen getrennten Datensätzen oder aufs PDF schreiben aber da steht es schon macht also ev. auch nur ein Getrennter Datensatz Sinn....

    Für mich ist nicht der (Source) Weg die Befriedigung sondern das Ergebniss...

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Das mag sein aber zum finalen Speichern gibt es ja auch _FileWriteFromArray (wenn es eine reine txt Datei sein soll), da bietet sich ein 2D Array durchaus an.

    Aber wie gesagt, da es dazu (noch) keine Infos gibt, wäre erstmal zu schauen wie es mit der Datenbechaffung aussieht. Wenn dann am Ende doch wieder ein XY-Problem sich herausstellt, hat zumindest der TE hoffentlich das ein oder andere noch dazu gelernt ;) (think positive! :D )

  • Liebe Profis,

    ich möchte Euch keine "Kaffeesatz-Leserei" zumuten oder "freundlicherweise" partout nicht verraten worum es geht! Es muss auch nicht anonymisiert werden, es tut nur schlichtweg
    eigentlicht gar nichts zur Sache bezüglich meiner Fragestellung. [Ich will Rechnungen einlesen und mit Bezahl- (oder Bestelldatum) sowie dem Preis im damit neu erstellenten Namen
    der PDF digital archivieren. That's all ...]

    ABER: Das hat doch gar nichts mit meiner Fragestellung zu tun?! Und auch wenn das von einigen sicherlich super nett gemeint ist:

    Ich suche keinen "Workaround" und erst recht soll keiner mein Script schreiben! Und für MICH ist der Weg das Ziel, sonst würde ich eine Auftragsprogrammierung erbitten und bezahlen.

    Insofern auch nochmals ganz herzlichen Dank an Moombas, der sich aus meiner Sicht der "eigentlichen Frage-/Problemstellung" widmet.

    Ich versuche es auch nochmal zu erklären: Ich möchte mittels Schleifendurchlauf (For..Next) die Steuervariable (z.B. $x) nutzen, um damit unterschiedliche Arrays anzusprechen.

    So soll beim 1. Schleifendurchlauf das $Array1, beim 2. Schleifendurchlauf das $Array2, usw. "ansprechbar" sein (_ArrayAdd, _ArraySort ...). Dies wollte ich naiver Weise mit der ohnehin

    vorhandenen Steuervariablen lösen. Ich wollte etwas wie "$Array[$x]", dass dann je nach Wert von $x (1,2, ...) für $Array1, $Array2, usw. steht - und dachte, ich hätte diesbezüglich
    eine klar formulierte Frage gestellt / Überschrift gewählt (soweit mir das mit meinen begrenzten AutoIt-Fähigkeiten möglich ist), die ich hier noch einmal wiederholen möchte:

    Ist es möglich, eine Variable innerhalb eines Array- Namens / einer Array-Bezeichnung zu nutzen?

    (Beim Erstellen und Abfragen von "Checkboxen" geht das ja auch)

    Variable in Objektnamen / Prozedur

    ; NUR ALS BEISPIEL !!!

    ; Erstellen

    $Abstand = 50

    ;

    For $x = 0 To 10

    $Checkbox[$x] = GUICtrlCreateCheckbox("Meine_CheckBox" & $x, 16, 10 + ($Abstand * $x), 240, 30)

    GUICtrlSetFont(-1,12,600)

    GUICtrlSetColor(-1,0xFFFFFF)

    Next

    ; Abfragen

    For $x = 0 To 10

    If BitAND(GUICtrlRead($Checkbox[$x]),$GUI_CHECKED) Then

    MsgBox(0,"Check on/off","CheckBox " & $x & " ist on")

    Else

    MsgBox(0,"Check on/off","CheckBox " & $x & " ist off")

    EndIf

    Next

    Alles andere (Datenerfassung, usw. usw.) versuche ich erstmal selbst zu erarbeiten - das ist auch meine ganz persönliche Vorstellung von einem Forum (ich adminstriere selber
    zwei Foren). Es ist meistens sehr nett gemeint, aber ich suche keine "zielgerichtete Lösung" für mein Gesamtprojekt, sondern möchte es mir selber "hinstümpern" und dabei
    bin ich auf eine Frage / Problem gestoßen. Und was ich suche, ist eine Antwort auf meine Frage oder eine entsprechende Alternative. Und nein, ich möchte auch kein MCFlurry
    zum Nachtisch :)

    LG Kilo

    Nachtrag: Da ich viel in Excel und VBA Programmiere (wo das Zuweisen von "Variablen innerhalb einer Variablen" übrigens funktioniert) dachte ich, dass "XY-Problem" tatsächlich

    für Achsen (z.B.: innerhalb einer Matrix oder eines Arrays) steht. Erst ein guter Freund hat mich gerade darauf aufmerksam gemacht, was ihr wirklich damit meint ...

    Vielen Dank! :ironie:

    Einmal editiert, zuletzt von kilo (2. Oktober 2023 um 13:56)

  • Hi @kilo : Das würde einem Array im Array entsprechen (du speicherst bei den Checkboxen ja das Handle dessen in einem Array, ein Array selber hat aber kein Handle).

    Dazu aus der Hilfe:

    "Sie können ein Array in einem Array-Element (item) speichern. Denken Sie daran, dass es zu Problemen kommen kann, wenn Sie ein Array, das Arrays enthält, an eine Funktion übergeben und das eingebettete Array innerhalb dieser Funktion geändert wird. Versuchen Sie also generell, keine Arrays in Arrays einzubetten, es sei denn, Sie müssen dies unbedingt tun und sind bereit, strenge Tests durchzuführen, um sicherzustellen, dass Ihr Code immer wie erwartet funktioniert." (Übersetzung aus dem engl.)

    Daher denke ich ist die Variante mit dem 2D-Array, was ja von Kanashius gleich zu anfang vorgeschlagen wurde und ich weiter ausgearbeitet hatte als Beispiel, die scheinbar beste Lösung.