FileWriteFromArray() mit Arrays in Arrays

  • Hallo,
    schaut euch mal dieses Script an: http://www.box.net/shared/0m781t8bfd
    (Runterladen & Entpacken - es geht um DescribeIt.au3)


    Alle Informationen bezüglich einer Funktion werden in einem 2D Array gespeichert.
    $aInfo[Anzahl der Funktionen][11]

    Dieser Array enthält selbst noch einmal 1 oder 2 D Arrays in manchen Elementen.
    zB: $aArray[$i][4] enthält wieder einen 2D array.

    Wie schaffe ich es, diesen Array abzuspeichern? Ini, Txt, Sql - egal.
    Ich hab leider auch keine Ahnung wie ich sowas angehen soll (Rekursion ist nich so meine Stärke)

  • Ich würd ma sowas machen
    For $i = Ubound($deinArray) -1
    FileWrite("C:\Datei.txt", [$i][$i])
    Next

    Ich habs jetzt nur so hingeschrieben, weiss net, obs klappt, oder ob das dein Problem ist :D
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Ich habs jetzt nur so hingeschrieben, weiss net, obs klappt, oder ob das dein Problem ist :D

    ne da bekommt er ziemlich sicher nen fehler
    wer sagt denn das in der ersten dimension genausoviele indexe vorhanden sind wie in der 2ten...

    • Offizieller Beitrag

    Deine Konstruktion ist etwas unglücklich. Arbeite doch lieber gleich mit 3 oder 4 Dimensionen. Dann hat man eine feste Zuordnung.
    Das von dir beschriebene Array ließe sich so schreiben (ungetestet):

    Spoiler anzeigen
    [autoit]

    Local $aInfo['Anzahl der Funktionen'][11]
    Local $path = 'Dateipfad'
    Local $tmp, $sWrite = ''
    Local $Delim = ';' ; dein gewünschtes Trennzeichen

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

    For $i = 0 To UBound($aInfo) -1
    For $j = 0 To UBound($aInfo, 2) -1
    $tmp = $aInfo[$i][$j]
    $sTmp = ''
    If IsArray($tmp) Then
    Local $2nd = UBound($tmp, 2)
    If @error Then $2nd = 0
    For $k = 0 To UBound($tmp) -1
    If $2nd Then
    For $l = 0 To $2nd -1
    $sTmp &= $tmp[$k][$l] & $Delim
    Next
    Else
    $sTmp &= $tmp[$k] & $Delim
    EndIf
    $sTmp &= @CRLF
    Next
    $sWrite &= $sTmp & $Delim & @CRLF
    Else
    $sWrite &= $tmp & $Delim
    EndIf
    Next
    $sWrite &= @CRLF
    Next

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

    FileWrite($path, $sWrite)

    [/autoit]

    Aber das Wiedereinlesen würde sicher eine Katastrophe :D .
    Arbeite doch von Anbeginn mit einer SQLite-DB.

  • @Pride: Einfach in die Datei hauen kann ich auch schon. Problematich ist dann natürlich das spätere einlesen (ich biete ja keine export funktion an, ohne dass man auch wieder importieren kann - das wär ja das absolute Service-Desaster :D

    BugFix danke für die Tips. Um die SQL mach ich gerne einen großen Bogen. Ich hab mich schon ein paar mal daran versucht, aber ich und SQLite konnten nie wirklich freunde werden. Ich konnte mir zwar ein bisschen einarbeiten (hauptsächlich habe ich mir den Galenda Source angeschaut) aber SQL ist nix für mich. Wenn möglich würde ich das gerne umgehen. (Obwohl ich mir den Vorteilen natürlich bewusst bin).

    Mit dem Scriptfetzen hast du mich allerdings gut in die richtige Richtung gestoßen denke ich - zumindest kommt so langsam die Motivation auf, mich diese Nacht tiefer in das Thema reinzuknieen.

    Wie du das mit dem 4D Array gemeint hast weiß ich auch noch nicht so ganz (klar bin ich mir bewusst, was ein 3 oder 4D array ist; Aber ich bin mir grade noch nicht sicher, wie ich die Daten dann dadrin abspeichern / diesen 4D Array in eine Datei schreibe / aus einer Datei lese.

    Die Problematik dürfte sich ja nicht wirklch unterscheiden

    Ich schau mal was sich machen lässt

    LG.

    • Offizieller Beitrag

    Hier mal, wie es bei einem 3D und 4D (für 4D war ich zu faul :D) aussehen könnte:

    Edit: Konnte meine Faulheit überwinden :rofl:

    Spoiler anzeigen
    [autoit]

    ; === Konfigurationsdatei Bsp.
    ; === Anzahl der Zeilen ist UBound für Dimension 1
    ; === durch Pipe "|" getrennte Blöcke ergeben Dimension 2
    ; === kommagetrennt Blöcke innerhalb der Pipe-getrennten Blöcke ergeben Dimension 3
    Local $file = _
    'Sub1_1_1,Sub1_1_2,Sub1_1_3|Sub1_2_1,Sub1_2_2,Sub1_2_3|Sub1_3_1,Sub1_3_2,Sub1_3_3' & @CRLF & _
    'Sub2_1_1,Sub2_1_2,Sub2_1_3|Sub2_2_1,Sub2_2_2,Sub2_2_3|Sub2_3_1,Sub2_3_2,Sub2_3_3' & @CRLF & _
    'Sub3_1_1,Sub3_1_2,Sub3_1_3|Sub3_2_1,Sub3_2_2,Sub3_2_3|Sub3_3_1,Sub3_3_2,Sub3_3_3' & @CRLF & _
    'Sub4_1_1,Sub4_1_2,Sub4_1_3|Sub4_2_1,Sub4_2_2,Sub4_2_3|Sub4_3_1,Sub4_3_2,Sub4_3_3' & @CRLF & _
    'Sub5_1_1,Sub5_1_2,Sub5_1_3|Sub5_2_1,Sub5_2_2,Sub5_2_3|Sub5_3_1,Sub5_3_2,Sub5_3_3' & @CRLF & _
    'Sub6_1_1,Sub6_1_2,Sub6_1_3|Sub6_2_1,Sub6_2_2,Sub6_2_3|Sub6_3_1,Sub6_3_2,Sub6_3_3' & @CRLF

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

    ; === Anzahl der Zeilen ist UBound für Dimension 1
    ; === durch Pipe "|" getrennte Blöcke ergeben Produkt aus: Ubound Dimension 2 * Ubound Dimension 3
    ; === kommagetrennt Blöcke innerhalb der Pipe-getrennten Blöcke ergeben Dimension 4
    Local $file2 = _
    'Sub1_1_1_1,Sub1_1_1_2|Sub1_1_2_1,Sub1_1_2_2|Sub1_1_3_1,Sub1_1_3_2|Sub1_2_1_1,Sub1_2_1_2|Sub1_2_2_1,Sub1_2_2_2|Sub1_2_3_1,Sub1_2_3_2|Sub1_3_1_1,Sub1_3_1_2|Sub1_3_2_1,Sub1_3_2_2|Sub1_3_3_1,Sub1_3_3_2' & @CRLF & _
    'Sub2_1_1_1,Sub2_1_1_2|Sub2_1_2_1,Sub2_1_2_2|Sub2_1_3_1,Sub2_1_3_2|Sub2_2_1_1,Sub2_2_1_2|Sub2_2_2_1,Sub2_2_2_2|Sub2_2_3_1,Sub2_2_3_2|Sub2_3_1_1,Sub2_3_1_2|Sub2_3_2_1,Sub2_3_2_2|Sub2_3_3_1,Sub2_3_3_2' & @CRLF & _
    'Sub3_1_1_1,Sub3_1_1_2|Sub3_1_2_1,Sub3_1_2_2|Sub3_1_3_1,Sub3_1_3_2|Sub3_2_1_1,Sub3_2_1_2|Sub3_2_2_1,Sub3_2_2_2|Sub3_2_3_1,Sub3_2_3_2|Sub3_3_1_1,Sub3_3_1_2|Sub3_3_2_1,Sub3_3_2_2|Sub3_3_3_1,Sub3_3_3_2' & @CRLF & _
    'Sub4_1_1_1,Sub4_1_1_2|Sub4_1_2_1,Sub4_1_2_2|Sub4_1_3_1,Sub4_1_3_2|Sub4_2_1_1,Sub4_2_1_2|Sub4_2_2_1,Sub4_2_2_2|Sub4_2_3_1,Sub4_2_3_2|Sub4_3_1_1,Sub4_3_1_2|Sub4_3_2_1,Sub4_3_2_2|Sub4_3_3_1,Sub4_3_3_2' & @CRLF & _
    'Sub5_1_1_1,Sub5_1_1_2|Sub5_1_2_1,Sub5_1_2_2|Sub5_1_3_1,Sub5_1_3_2|Sub5_2_1_1,Sub5_2_1_2|Sub5_2_2_1,Sub5_2_2_2|Sub5_2_3_1,Sub5_2_3_2|Sub5_3_1_1,Sub5_3_1_2|Sub5_3_2_1,Sub5_3_2_2|Sub5_3_3_1,Sub5_3_3_2' & @CRLF & _
    'Sub6_1_1_1,Sub6_1_1_2|Sub6_1_2_1,Sub6_1_2_2|Sub6_1_3_1,Sub6_1_3_2|Sub6_2_1_1,Sub6_2_1_2|Sub6_2_2_1,Sub6_2_2_2|Sub6_2_3_1,Sub6_2_3_2|Sub6_3_1_1,Sub6_3_1_2|Sub6_3_2_1,Sub6_3_2_2|Sub6_3_3_1,Sub6_3_3_2' & @CRLF

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

    ; === Array erstellen aus Datei
    Local $aD1 = StringSplit($file, @CRLF, 1), $aLine, $aData
    Local $array3D[$aD1[0]][3][3]

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

    For $i = 1 To $aD1[0] -1
    $aLine = StringSplit($aD1[$i], '|')
    For $j = 1 To 3
    $aData = StringSplit($aLine[$j], ',')
    For $k = 1 To 3
    $array3D[$i-1][$j-1][$k-1] = $aData[$k]
    ConsoleWrite($i-1 & '-' & $j-1 & '-' & $k-1 & ': ' & $aData[$k] & @CRLF)
    Next
    Next
    Next

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

    ConsoleWrite(@CRLF & 'Jetzt 4D-Array' & @CRLF & @CRLF)
    $aD1 = StringSplit($file2, @CRLF, 1)
    Local $array4D[$aD1[0]][3][3][2], $iD2, $iD3

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

    For $i = 1 To $aD1[0] -1
    $aLine = StringSplit($aD1[$i], '|')
    $iD2 = 0
    $iD3 = 0
    For $j = 1 To 9 ; Ubound_D2 * UBound_D3
    $aData = StringSplit($aLine[$j], ',')
    For $k = 1 To 2
    $array4D[$i-1][$iD2][$iD3][$k-1] = $aData[$k]
    ConsoleWrite($i-1 & '-' & $iD2 & '-' & $iD3 & '-' & $k-1 & ': ' & $aData[$k] & @CRLF)
    Next
    $iD2 += 1 ; === die Indexe verhindern zu sehr verschachtelte Schleifen, 3-fach For reicht ;)
    If $iD2 = 3 Then
    $iD2 = 0
    $iD3 += 1
    If $iD3 = 3 Then $iD3 = 0
    EndIf
    Next
    Next

    [/autoit]


    In die Datei zu Schreiben ist dann einfach nur die Umkehrung des obigen Codes.