Speichern eines arrays in einer Text datei

  • Hi Autoit community,


    ich habe folgendes problem:
    ich habe mir ein Programm geschrieben das ein 2d array besitzt und möchte dieses nun in einer Text datei speichern.
    Das array sieht so aus:
    Dim $array[20][6]
    $array[0][0] = 1
    $array[0][1] = 2
    ...
    $array[19][5] = 12
    nun sollte meine text file so aussehen
    $array[0][0] = 1
    $array[0][1] = 2
    ....
    $array[19][5] = 12

    also sollte in jeder zeile der text datei das das array mit dem jeweils zugehörigen wert stehen

    Hoffe einer von euch hat einen Lösungsvorschlag

    Mit freundlichen Grüßen
    Doomedone

    Einmal editiert, zuletzt von Doomedone (18. Januar 2011 um 23:22)

  • Probier's mal damit:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Dim $array[20][6]
    $x = 1
    For $i = 0 To UBound($array) - 1
    For $j = 0 To UBound($array, 2) - 1
    $array[$i][$j] = $x
    $x += 1
    Next
    Next

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

    $string = ""
    For $i = 0 To UBound($array) - 1
    For $j = 0 To UBound($array, 2) - 1
    $string &= "$array[" & $i & "][" & $j & "] = " & $array[$i][$j] & @LF
    Next
    Next

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

    $hFile = FileOpen(@ScriptDir & "\2DArray.txt", 2)
    FileWrite($hFile, $string)
    FileClose($hFile)
    Exit

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich erkenne jetzt nicht dirket eine feste reihenfolge wie die Zahlen in dem Array zugeordent sind, aber man könnte
    einen String mit einer (bzw 2)For-Schleifen immer um den nächsten Arrayeintrag+@CRLF erweitern, und diesen String dann in die Textdatei schreiben
    Z.B.:

    Spoiler anzeigen
    [autoit]

    Dim $array[10][10]
    $path = @Scriptdir
    For $x = 0 to 9
    For $y = 0 to 9
    $array[$x][$y] = $y+10*$x ;Belegen des Arrays mit aufsteigenden Werten von 0 bis 99
    Next
    Next

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

    ;In den String schreiben
    $String = ""
    For $x = 0 to 9
    For $y = 0 to 9
    $string &= "Array["&$x&"]["&$y&"] = "&$array[$x][$y]&@CRLF
    Next
    Next

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

    ;in Datei schreiben
    $file = fileopen($path&"\test.txt", 2)
    filewrite($file, $string)
    fileclose($file)

    [/autoit]

    //Edit: War wohl jemand schneller...

  • Hallo Doomedone,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinem Problem: UEZ hat dir zwar die Lösung genau so gepostet wie du ie wolltest, einfacher hättest du es aber mit

    [autoit]

    _FileWriteFromArray

    [/autoit]

    denn das kannst du mit

    [autoit]

    _FileReadToArray

    [/autoit]

    wieder einlesen,

    mfg autoBert

  • Kann _FileWriteFromArray() ein 2D Array in eine Datei schreiben?

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>

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

    Dim $array[20][6]
    $x = 1
    For $i = 0 To UBound($array) - 1
    For $j = 0 To UBound($array, 2) - 1
    $array[$i][$j] = $x
    $x += 1
    Next
    Next

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

    _FileWriteFromArray(@ScriptDir & "\2DArray_.txt", $array)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke für die Zahlreichen Antworten.
    Um alles Zusammenzufassen UEZ und Fresapore eure codes haben einwandfrei funktioniert und mein Problem gelöst^^
    nur bei UEZ hatte es bei mir ein Problem mit @LF als enter befehl den ich durch @CRLF ersetzen musste sonst alles perfect^^
    und wie UEZ schon sagte das mit _FileWritefromArray geht nicht so wirklich trotzdem danke für die ganzen Antworten

    Mit freundlichen Grüßen
    Doomedone

  • Hallo, es ist zwar schon alles etwas her, aber vielleicht versucht ja noch jemand eine Exeltabelle in eine Array einzulesen und stellt fest das das immer echt lange dauert.
    Ich habe deswegen versucht das Array was mir _ExcelReadSheetToArray($oExcel) liefert in eine Datei zu schreiben und anschließend wieder auszulesen.
    Das geht wesentlich schneller.

    Ich habe mir also zwei Funktionen geschrieben weil ich mit den Vorschlägen hier im Thread nicht klar gekommen bin.

    HAVE FUN:

    Gruß
    Wolke

  • ich arbeite ebenfalls sehr viel mit Excel und habe mir angewöhnt, die zu bearbeitende Datei vorher als .csv zu speichern und dann als Array einzulesen.

    Hier mal die 2 Funktionen, die du dafür brauchst: (_CSV2Array ist nicht von mir, hab aber leider den Autor nicht mehr gefunden)

    [autoit]

    ; #FUNCTION#
    ;===============================================================================
    ; Function Name: _ExcelSaveAs($oExcel, $Fileformat, $NewFilepath, $Close = True)
    ; Description: Speichert eine Exceldatei in einem bestimmten Format ab
    ; Parameter(s): $oExcel Ein Excelobject, wie es von _ExcelbookOpen oder _ExcelbookNew zurückgegeben wird
    ; $Fileformat Der Dateityp, in dem gespeichert werden soll (xlsx, xlsb, xlsm, xls, csv, txt, prn)
    ; $NewFilepath Speicherort und Dateiname der neuen Datei
    ; $Close = True Soll nach dem Speichern das Objekt geschlossen werden? (Standard = True)
    ; Return Value(s): Erfolg Gibt 1 zurück
    ; Fehler @error 1 - $oExcel ist kein Objekt
    ; 2 - $Fileformat ist keine bekannte Dateiendung oder Formatnummer
    ; Author(s): TheLuBu ([email='LuBu@veytal.com'][/email])
    ; Copyright: TheLuBu ([email='LuBu@veytal.com'][/email])
    ;===============================================================================
    Func _ExcelSaveAs($oExcel, $vFileformat, $vNewFilepath, $bClose = True)
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    Switch $vFileformat
    Case 51, "xlsx", ".xlsx"
    $vFileformat = 51
    Case 50, "xlsb", ".xlsb"
    $vFileformat = 50
    Case 52, "xlsm", ".xlsm"
    $vFileformat = 52
    Case 6, "csv", ".csv"
    $vFileformat = 6
    Case -4158, "txt", ".txt"
    $vFileformat = -4158
    Case 36, "prn", ".prn"
    $vFileformat = 36
    Case 56, "xls", ".xls"
    $vFileformat = 56
    Case Else
    Return SetError(2, 0, 0)
    EndSwitch
    With $oExcel
    .Application.DisplayAlerts = False ; Schaltet Fehlermeldungen bei Excel aus
    .ActiveWorkBook.SaveAs($vNewFilepath, $vFileformat)
    If $bClose Then
    .ActiveWorkbook.Close ; Schließt die Tabelle
    .Quit ; Schließt das Workbook
    EndIf
    EndWith
    Return 1
    EndFunc ;==>_ExcelSaveAs

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

    Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)
    If $cSeperator = Default Then $cSeperator = "auto"
    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")
    ; searching the line-seperator and splitting the lines into an array
    Local $aLines
    If StringInStr($s, @CRLF) Then
    $aLines = StringSplit($s, @CRLF, 1)
    ElseIf StringInStr($s, @CR) Then
    $aLines = StringSplit($s, @CR)
    Else
    $aLines = StringSplit($s, @LF)
    EndIf
    ; searching the delimiter in the first line
    Local $aTMP
    If $cSeperator = "auto" Then
    Local $iMax = 0
    Local $iC[5] = [0, 0, 0, 0, 0]
    Local $sC[4] = [";", ",", @TAB, "|"]
    $aTMP = StringRegExp($aLines[1], ";", 3)
    If Not @error Then $iC[0] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], ",", 3)
    If Not @error Then $iC[1] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\t", 3)
    If Not @error Then $iC[2] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\|", 3)
    If Not @error Then $iC[3] = UBound($aTMP)
    ;~ $aTMP = StringRegExp($aLines[1], "[ ]", 3)
    ;~ If Not @error Then $iC[4] = UBound($aTMP)
    For $i = 0 To UBound($sC) - 1
    If $iC[$i] > $iMax Then
    $iMax = $iC[$i]
    $cSeperator = $sC[$i]
    EndIf
    Next
    EndIf
    ; creating 2-dim array based on the number of data in the first line
    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]
    Local $aRet[$aLines[0]][$iCol]
    ; splitting and filling the lines
    For $i = 1 To $aLines[0]
    $aTMP = StringSplit($aLines[$i], $cSeperator)
    If @error Then ContinueLoop
    If $aTMP[0] > $iCol Then
    Switch $iColumnMode
    Case 0
    Return SetError(2, $i)
    Case 1
    ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
    Case 2
    $aTMP[0] = $iCol
    Case Else
    Return SetError(3)
    EndSwitch
    EndIf
    For $j = 1 To $aTMP[0]
    $aTMP[$j] = StringStripWS($aTMP[$j], 7)
    If $bFilterString Then ; removing leading and trailing " or '
    $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')
    EndIf
    $aRet[$i - 1][$j - 1] = $aTMP[$j]
    Next ; /cols
    Next ; /lines
    Return $aRet
    EndFunc ;==>_CSV2Array

    [/autoit]

    Ich arbeite mit Exceltabellen, die zwischen 20.000 und 250.000 Einträge haben, das einlesen einer csv, also Textdatei ist da ein immenser Zeitsparfaktor, auch wenn man später nochmal die Spalten anpassen muss

    [autoit]


    With $oExcel
    .Columns("H:H" ).Select ; Spalte H auswählen
    .Selection.NumberFormat = "0" ; als Zahl formatieren, die Numberformate kannst du dir aus der Makroaufnahme von Excel holen.
    EndWith

    [/autoit]