Arrays: Auf Zelle zugreifen

  • Hallo,

    es gibt Dinge im Leben die scheint man nie zu lernen.
    In meinem Leben sind das Arrays brrrrr

    Ich habe da (...mit Hilfe von Bugfix) einen Codeabschnitt, den ich nicht 100% verstehe!
    Diesen habe ich mal auskommentiert, soweit wie ich das verstanden habe.

    Hier ist meine Tabelle (Liste.csv)

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Zuerst mal der kpl. Code

    [autoit]


    #include <Array.au3>
    #include <file.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global $aStadt, $sPathStadt = 'Liste.csv' ; heißt das Alle Texte der Liste.csv sind in dieser Variablen?
    Global $sSeparatorCSV = ';' ;Das ist der Datensatztrenner

    [/autoit][autoit][/autoit][autoit]

    _FileReadToArray($sPathStadt, $aStadt) ; Liste.csv einlesen in Array
    ; Element1 ist Zähler, Element2 enthält Spaltenüberschriften
    ; in 2D-Array übertragen
    Global $aStadt2D[$aStadt[0]-1][11] ; von hier bis Ende brauche ich Hilfe??????
    Local $aTmp ; wieso diese Variable?
    For $i = 2 To $aStadt[0]
    $aTmp = StringSplit($aStadt[$i], $sSeparatorCSV)
    For $j = 1 To $aTmp[0]
    $aStadt2D[$i-2][$j-1] = $aTmp[$j]
    Next
    Next
    ;Wie kann man die Zeile 3 Spalte 3 ansprechen?
    MsgBox(0,"Meine Zelle ist:",$aStadt[1])

    [/autoit]

    Meine Frage:
    Wie kann ich auf "ZELLEN" zugreifen!

    Vielleicht platzt ja doch noch irgendwann der Knoten
    und ich kapier's doch noch.

    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (1. April 2011 um 18:41)

  • danke für den Tipp,

    ich lese sehr viel aber bleibe irgendwie immer wieder hängen.
    Wenn du mir die Zeilen etwas erklären kannst (warum, wieso)
    dann probier ich selbst und versteh's vielleicht.
    Kannst du mir sagen, wie man auf diese Zelle zugreifen kann?

    Grüße
    Ilse

  • Hast du das in Zeile 16 nicht schon gemacht :D
    Übrigens glaube ich, dass das Array Tutorial das schon gut erklärt. Besser kann ich es auch nicht.

  • Hallo progandy,

    Zitat

    Hast du das in Zeile 16 nicht schon gemacht?

    wie gesagt Code ist nicht v. mir, deßhalb die Fragen!
    Ich arbeite gerade das Tutorial nochmal durch.

    ABER: ich finde nirgends wie man auf eine ZELLE zugreifen kann!
    Zeile ja
    Spalte ja
    Zelle?

    Wie kann ich diesen Wert lesen?

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Spoiler anzeigen


    #include <Array.au3>
    #include <file.au3>


    Global $aStadt, $sPathStadt = 'Liste.csv' ; heißt das Alle Texte der Liste.csv sind in dieser Variablen?
    Global $sSeparatorCSV = ';' ;Das ist der Datensatztrenner

    _FileReadToArray($sPathStadt, $aStadt) ; Liste.csv einlesen in Array
    ; Element1 ist Zähler, Element2 enthält Spaltenüberschriften
    ; in 2D-Array übertragen
    Global $aStadt2D[$aStadt[0]-1][11] ; von hier bis Ende brauche ich Hilfe??????
    Local $aTmp ; wieso diese Variable?
    For $i = 2 To $aStadt[0]
    $aTmp = StringSplit($aStadt[$i], $sSeparatorCSV)
    For $j = 1 To $aTmp[0]
    $aStadt2D[$i-2][$j-1] = $aTmp[$j]
    Next
    Next
    ;Wie kann man die Zeile 3 Spalte 3 ansprechen?
    MsgBox(0,"Meine Zelle ist:",$aStadt[1])

    Grüße
    Ilse ;)

  • Ich hab bislang 2D Arrays auch immer vermieden und erst neulich das erste mal damit gearbeitet. Am einfachsten ist es sich das Array erstmal mit ArrayDisplay anzeigen zu lassen, dann sollte sich der Zugriff auf einzelne Elemente recht gut selbst erklären. So wie ich deinen Quellcode gerade überflogen habe ist das 2D Array so organisiert, dass bei [a][b] das b für die Kategorie also Stadt/Fluss usw. steht und das a für den x-ten Eintrag in dieser Kategorie. Wenn du also die dritte Stadt haben willst dürfte der Aufruf dafür so lauten aStadtd2D[3][0], der zur Stadt gehörende Fluss wäre dann [3][2] usw. Kann aber durchaus sein, dass ich mich da gerade vertan habe, so genau hab ich den Quellcode nicht angeschaut.

  • [autoit]

    Global $aStadt2D[$aStadt[0]-1][11] ; Hier wird das Array einfach nur deklariert und ihm eine bestimmte Größe zugewiesen (Anzahl Zeilen und Spalten)
    Local $aTmp ; eine temporäre Variable, der anschließend in der 1. For-Schleife immer wieder ein neuer Wert zugewiesen wird
    For $i = 2 To $aStadt[0]
    $aTmp = StringSplit($aStadt[$i], $sSeparatorCSV) ; der temporären Variablen wird ein Wert zugewiesen (in diesem Fall wird "$aTmp" ein eindimensionales Array) , mehrmals, das For-Schleife
    For $j = 1 To $aTmp[0]
    $aStadt2D[$i-2][$j-1] = $aTmp[$j] ; Inhalt der temporären Variablen (hier ein Array, durch "StringSplit") wird in bestimmte Zelle !!! des Arrays geschrieben , mehrmals, das For-Schleife
    Next
    Next
    MsgBox(0,"Meine Zelle ist:",$aStadt2D[X][X]) ; Inhalt der gewählten Zelle des Arrays wird ausgegeben (kann aber nich genau sagen welche Zeilen- und Spaltennummer deine gewollte Zelle hat, probiers einfach aus, Post vor mir scheint ein guter Wert)

    [/autoit]


    Hoffe, dass die Kommentare etwas zum Verständnis beitragen, Gruß

  • @ alle

    erstmal 1000 Dank.
    @ Misterspeed
    ich glaube dein Tipp mit _ArrayDisplay($aStadt2D)
    hat meinen Knoten etwas gelöst.

    Spoiler anzeigen


    #include <Array.au3>
    #include <file.au3>


    Global $aStadt, $sPathStadt = 'Liste.csv' ; heißt das Alle Texte der Liste.csv sind in dieser Variablen?
    Global $sSeparatorCSV = ';' ;Das ist der Datensatztrenner

    _FileReadToArray($sPathStadt, $aStadt) ; Liste.csv einlesen in Array
    ; Element1 ist Zähler, Element2 enthält Spaltenüberschriften
    ; in 2D-Array übertragen
    Global $aStadt2D[$aStadt[0]-1][11] ; von hier bis Ende brauche ich Hilfe??????
    Local $aTmp ; wieso diese Variable?
    For $i = 2 To $aStadt[0]
    $aTmp = StringSplit($aStadt[$i], $sSeparatorCSV)
    For $j = 1 To $aTmp[0]
    $aStadt2D[$i-2][$j-1] = $aTmp[$j]
    Next
    Next
    _ArrayDisplay($aStadt2D)

    MsgBox(0,"Meine Zelle ist:",$aStadt2D[1][2])

    Bin noch am probieren.
    Das kapier ich noch nicht so ganz

    [autoit]


    For $j = 1 To $aTmp[0]
    $aStadt2D[$i-2][$j-1] = $aTmp[$j]
    Next

    [/autoit]


    Warum muß ich hier die Schleife machen,
    Ich splitte irgendwie das String (Datensatztrenner)
    ab dann...da steh ich ehrlich gesagt noch ziemlich auf dem Schlauch...

    Dank euch
    Ilse ;)

    2 Mal editiert, zuletzt von Ilse (1. April 2011 um 13:54)

  • Nunja in dieser Schleife wird eben das 2DArray befüllt. In der ersten Schleife geht man die CSV Zeilenweise durch und benutzt dann für jede Zeile Stringsplit um die einzelnen Einträge jeder Zeile in ein Array zu schreiben. aTmp sieht dann also so aus:

    $atmp[0] = Index des letzten Array Eintrages
    $atmp[1] = Stadtname
    $atmp[2] = Landname
    $atmp[3] = Flussname

    In der zweiten Schleife die du nicht verstehst wird dann jeder Eintrag von aTmp, also von Stadt bis Fluss in die aktuelle Zeile des 2D Arrays geschrieben. Ist das erledigt wird die nächste Zeile der CSV gelesen und die nächste Zeile des 2D Arrays beschrieben. Das was etwas verwirrend ist ist eigentlich nur die Index Adressierung. Das hängt damit Zusammen, dass in deiner CSV die Daten erst in Zeile 2 anfangen, in Zeile 1 stehen die Tabellenüberschriften die du nicht im Array haben willst. Dadurch dass wir erst bei 2 anfangen, dein 2D Array aber in Zeile 0 beschrieben wird muss hier $i-2 benutzt werden. Für $j, also die Kategorie gilt ähnliches. Stringsplit liefert ein 1-based Array zurück, das heisst in atmp[0] stehen keine Daten sondern der Index des letzten Eintrages. Da dein 2D Array aber 0-based ist fangen wir nicht bei 1 sondern bei 0 an zu schreiben, deswegen müssen wir $j-1 verwenden.

    Gut vorstellen kann man sich das indem man sich alle beteiligten Arrays mal anzeigen lässt und die ersten 2-3 Durchläufe mal von Hand mit einem Blatt Papier durchspielt. Es ist verwirrend da geb ich dir Recht, aber wenn man es einmal verstanden hat ist es keine Große Sache mehr, auch wenn dir sicher immer mal wieder Fehler unterlaufen werden wenn du mit Arrays unterschiedlicher Basis arbeitest.

  • Ilse,

    Zitat

    es gibt Dinge im Leben die scheint man nie zu lernen.
    In meinem Leben sind das Arrays brrrrr


    hast du schon einmal mit einer Tabellenkalkulation, z.B. Excel oder ähnlich gearbeitet?
    Dort hast du Zeilen und Spalten, die wiederum die Position einer Zelle beschreiben, in der EIN Wert steht.

    Oder hast du mal auf einer topografischen Karte die Längen- und Breiten-Koordinaten für EINEN Standort bestimmt?

    Woher weiss dein Navigationsgerät oder Handy, wo du dich zur Zeit befindest?

    Hast du mal einen Blechkuchen in 20 gleiche Teile geteilt?

    Oder in der Schule 30 Schüler in 5 Reihen a 6 Bänken verteilt?

    Woher weisst du, in welches Stockwerk und welches Zimmer du musst, wenn du einen Hotelschlüssel mit der Nummer 3-16 hast? (der Bindestrich wird auf den Schlüsselanhängern weggelassen)^^


    Das sind alles 2D-Arrays, somit kann ich garnicht glauben, dass du noch niemals damit zu tun hattest!

    /EDIT/
    Ich nehme an, das Beispiel der 30 Schüler ist am einfachsten. Wir verteilen die 30 Schüler auf 5 Reihen a 6 Bänken.
    Wenn Peter in der 4. Reihe in der 2. Bank sitzt, was würde ein Kindergartenkind machen, um Peter zu finden?
    Es würde jede Reihe Bank für Bank durchgehen und jeden Schüler fragen:" Bist du Peter?"
    Genau so macht das der Computer auch, wenn er nicht weiss, in welcher Reihe und in welcher Bank Peter sitzt....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (1. April 2011 um 15:33)

  • ...ich mußte wieder los.

    Auf jedenfall vielen vielen Dank für eure Zeilen.
    Ich habe heute sehr viel über Arrays gelernt.

    Ihr seid alle Super!!!

    @ Bugfix
    schön daß du dich wieder meldest!
    ...da ist alles in Ordnung. Läuft prima!
    Ich kenne mich mit CSV, Excel, Strukturen... aus, hatte nur ein Problem mit den Arrays in deinem Code!
    D.h. ich konnte deine Array Zeilen einfach nicht entschlüsseln, habe halt nicht 100% alles verstanden...was der große Meister
    mir da serviert hat. Ich will's doch lernen!
    Es gibt für mich nichts schlimmeres wenn man eine Zeile liest und nur x% versteht.

    Ich werde mich jedenfalls nochmal intensiv mit deinem Array-Tutorial beschäftigen.

    Liebe Grüße
    Ilse ;)