_FileWriteFromArray schreibt nicht

  • Hallo,

    kann mir jemand sagen warum die *.txt Datei zwar angelegt aber leer bleibt?

    [autoit]


    #include <Array.au3>
    #include <File.au3>
    Dim $T
    Dim $arATB[513][5]

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

    For $r = 0 To 512
    For $c = 0 To 4
    $T = Int(Random(20) + 1)
    $arATB[$r][$c] = $T
    Next
    Next
    ;_ArrayDisplay($arATB,"Test",0)
    _FileWriteFromArray(@ScriptDir & "\atb.txt", 0,0)

    [/autoit]

    Und gleich noch eine Zusatzfrage: Wie könnte das ganze Array "leer" erstellt werden?

    Dank und Gruß
    Thomas

    Einmal editiert, zuletzt von TJF (22. Januar 2010 um 15:14)

  • File.au3 - _FileWriteFromArray

    [autoit]


    For $x = $i_Base To $i_UBound
    If FileWrite($hFile, $a_Array[$x] & @CRLF) = 0 Then
    $ErrorSav = 3
    ExitLoop

    [/autoit]

    Sieht so aus als könnte die Funktion keine mehrdimensionalen Arrays verarbeiten.
    Die Datei wird erstellt und @error=2 zurückgegeben (Eingabe ist kein Array).
    Deshalb bleibt die Datei leer.

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Dim $T
    Dim $arATB[513][5]

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

    For $r = 0 To 512
    For $c = 0 To 4
    $T = Int(Random(20) + 1)
    $arATB[$r][$c] = $T
    Next
    Next
    ;~ ;_ArrayDisplay($arATB,"Test",0)
    _FileWriteFromArray2D($arATB, @ScriptDir & "\atb.txt")

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

    Func _FileWriteFromArray2D($aArray,$sFile)
    If Not IsHWnd($sFile) Then $sFile = FileOpen($sFile,2)
    If Not IsArray($aArray) Then Return SetError(1)
    If UBound($aArray,0) > 2 Then Return SetError(1)
    Local $sRet, $iUboundx = UBound($aArray), $iUboundy = UBound($aArray,2)

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

    For $x = 0 to $iUboundx-1

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

    If Not $x = $iUboundx-1 Then $sRet &= @CRLF

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

    For $y = 0 to UBound($aArray,2)-1
    $sRet &= $aArray[$x][$y]
    If Not $y = $iUboundy-1 Then $sRet &= "|"
    Next
    Next
    FileWrite($sFile,$sRet)
    EndFunc

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

    Func _FileReadToArray2D($sFile, ByRef $aArray)
    If Not IsHWnd($sFile) Then $sFile = FileOpen($sFile,1)
    If Not IsArray($aArray) Then Return SetError(1)
    $sRead = FileRead($sFile)
    $aSplitX = StringSplit($sFile,@CRLF,1)
    If UBound($aArray) <= $aSplitX[0] Then ReDim $aArray[$aSplitX[0]+100]
    For $x = 1 to $aSplitX[0]
    $aSplitY = StringSplit($aSplitX[$x],"|")
    If UBound($aArray,2) <= $aSplitY[0] Then ReDim $aArray[UBound($aArray)][$aSplitY[0]+100]
    For $y = 1 to $aSplitY[0]
    $aArray[$x-1][$y-1] = $aSplitY[$y]
    Next
    Next
    EndFunc

    [/autoit]
  • Die Erstellung der *.txt klappt jetzt grundsätzlich mit den Funktionen, die SEuBo gepostet hat. Vielen Dank! Nur mit den Trennern hapert es noch. S. Anlagen. Ich wollte in 5 Spalten alle Zeilen schreiben...

    Hat noch jemand eine Idee, wie man ähnlich ein leeres Array erstellen kann, das dann mit mehreren eindimensionale Zahlenspalten aus einem anderen Array eingelesen werden kann?

    Dank und Gruß
    Thomas

  • Meine letzte Frage erübrigt sich zumindest so:

    [autoit]


    For $r = 0 To 512
    For $c = 0 To 4
    $arATB[$r][$c] = ""
    Next
    Next

    [/autoit]

    Die erste Frage mündet dahin, wie die Funktion _FileWriteFromArray5D formatiert... :?:

    Dank und Gruß an alle!
    Thomas

    Einmal editiert, zuletzt von TJF (20. Januar 2010 um 13:50)

  • Sorry, war beim letzen Post nicht mehr so ganz auf der mentalen Höhe...
    Hier die (hoffentlich) Bugfreien Versionen der Funktionen.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Dim $T
    Dim $arATB[513][5]

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

    For $r = 0 To 512
    For $c = 0 To 4
    $T = Int(Random(20) + 1)
    $arATB[$r][$c] = $T
    Next
    Next

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

    ;~ _ArrayDisplay($arATB,"Test",0)
    _FileWriteFromArray2D($arATB, @ScriptDir & "\atb.txt")

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

    Global $TestArray
    _FileReadToArray2D(@ScriptDir & "\atb.txt", $TestArray)
    _ArrayDisplay($TestArray)

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

    Func _FileWriteFromArray2D($aArray,$sFile)
    If IsString($sFile) Then $sFile = FileOpen($sFile,2)
    If Not IsArray($aArray) Then Return SetError(1)
    If UBound($aArray,0) > 2 Then Return SetError(1)
    Local $sRet, $iUboundx = UBound($aArray), $iUboundy = UBound($aArray,2)
    For $y = 0 to $iUboundy-1
    For $x = 0 to $iUboundx-1
    $sRet &= $aArray[$x][$y]
    If $x < $iUboundx-1 Then $sRet &= "|"
    Next

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

    If $y < $iUboundy-1 Then $sRet &= @CRLF
    Next
    FileWrite($sFile,$sRet)
    FileClose($sFile)
    EndFunc

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

    Func _FileReadToArray2D($sFile, ByRef $aArray)
    If IsString($sFile) Then $sFile = FileOpen($sFile,0)
    If Not IsArray($aArray) Then Dim $aArray[100][10]
    Local $iMaxY
    $sRead = FileRead($sFile)
    $aSplitX = StringSplit($sRead,@CRLF,1)
    If UBound($aArray) <= $aSplitX[0] Then ReDim $aArray[UBound($aArray)][$aSplitX[0]+10]
    For $x = 1 to $aSplitX[0]
    $aSplitY = StringSplit($aSplitX[$x],"|")
    If UBound($aArray,2) <= $aSplitY[0] Then ReDim $aArray[$aSplitY[0]+100][UBound($aArray,2)]
    For $y = 1 to $aSplitY[0]
    $aArray[$y-1][$x-1] = $aSplitY[$y]
    Next
    ;~ _ArrayDisplay($aArray)
    If $iMaxY < $y Then $iMaxY = $y
    Next
    ReDim $aArray[$iMaxY-1][$x-1]
    FileClose($sFile)
    EndFunc

    [/autoit]

    Nur zum Verständniss:
    Ein 5Dim Array wäre sowas hier $aArray[10][15][5][10][20]. Du hast noch einen 2D Array ($aArray[10][100]) ;)

    Zu deiner Frage wie man einen leeren Array mit der Größe erstellt:

    Dim $aArray[512][5]. Fertig. :P

    Probier die Funktinoen mal aus. Dann kannst du ja nochmal Rückmeldung geben.

  • Hi,

    vielen Dank! Das mit dem 5D ist mir nach meinem Posting auch gekommen...

    Die *.txt schreibt jetzt alle Spalten formatiert in Zeilen - was schon mal ein Fortschritt ist... :) Bloß sollten die Spalten als Spalten erscheinen - also anders herum. Genauso wie es _ArrayDisplay anzeigt. Anliegend unten schicke ich mal eine Datei mit 2 Spalten. Das sind Messdaten, die links die Frequenz und rechts den Pegelwert stehen haben. Ich will die linke Reihe auswerten und in das große Array schreiben, dann rechts daneben die (relativen) Pegelwerte in absolute umrechnen und ebenfalls in das Array schreiben. Danach noch drei andere elektrische Werte (Spalten) aus anderen Dateien dazu. Das muss wieder in derselben Form sein, damit alle Meßdaten zusammen von einer Simulationssoftware auf einmal eingelesen werden können. Grundsätzlich soll das Endergebnis dann also so ausschauen wie in der anliegenden Datei - nur mit 5 Spalten. Dabei ist (neben dem Inhalt natürlich) die Formatierung der *.txt das entscheidende...

    Viele Grüße
    Thomas

  • Hallo SEuBo,

    ich bekomme Deine Funktion nicht dazu, dass sie Zeilen als Zeilen und Spalten als Spalten schreibt. Könntest Du mir da bitte nochmal helfen?

    Dank und Gruß
    Thomas

  • Hi,

    jetzt bin ich doch hier bei BugFix fündig geworden.

    Vielen Dank!
    Thomas

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Dim $T
    Dim $arATB[513][5]

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

    For $r = 0 To 512
    For $c = 0 To 4
    $T = Int(Random(20) + 1)
    $arATB[$r][$c] = $T
    Next
    Next
    _ArrayDisplay($arATB,"Test",0)
    _FileWriteFromArray2D(@ScriptDir & "\test.txt", $arATB)

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

    ;==========================================================================================================================================
    ; Function: _FileReadToArray2D($FILEPATH, $ARRAY [, $DELIM=-1])
    ;
    ; Description: Read 1D/2D array from file, if $DELIM is given (<> -1) 2D array will created
    ;
    ; Parameter(s): $FILEPATH - path/filename of the file to read in an array
    ; $ARRAY - array variable to hold readed data
    ; optional $DELIM - delimiter for 2D-array entries, default -1 (none 2D-array)
    ;
    ; Requirement(s): None
    ;
    ; Return Value(s): On Success - Returns -1
    ; On Failure - Returns 0 and sets @error = 1 (given file are not seperated with given delimiter or count of delimiters
    ; are not equal); @error = 2 (unable to open filepath)
    ;
    ; Note: If given file is delimited to create 2D-array ALL lines need the same count of delimiters, otherwise an error occurs!
    ;
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ;==========================================================================================================================================
    Func _FileReadToArray2D($FILEPATH, ByRef $ARRAY, $DELIM=-1)
    Local $fh = FileOpen($FILEPATH, 0), $line, $var, $n = 1
    If $fh = -1 Then
    SetError(2)
    Return 0
    EndIf
    If $DELIM <> -1 Then
    $line = FileReadLine($fh, 1)
    $var = StringSplit($line, $DELIM)
    If IsArray($var) Then
    $Ubound2nd = $var[0]
    Local $AR[1][$Ubound2nd]
    $AR[0][0] = 0
    Else
    SetError(1)
    Return 0
    EndIf
    While 1
    $line = FileReadLine($fh, $n)
    If @error = -1 Then ExitLoop
    $var = StringSplit($line, $DELIM)
    If IsArray($var) Then
    ReDim $AR[UBound($AR)+1][$Ubound2nd]
    For $i = 0 To $Ubound2nd-1
    $AR[UBound($AR)-1][$i] = $var[$i+1]
    Next
    $AR[0][0] += 1
    Else
    SetError(1)
    Return 0
    EndIf
    $n += 1
    Wend
    Else
    Local $AR[1]
    $AR[0] = 0
    While 1
    $line = FileReadLine($fh, $n)
    If @error = -1 Then ExitLoop
    ReDim $AR[UBound($AR)+1]
    $AR[UBound($AR)-1] = $line
    $AR[0] += 1
    $n += 1
    WEnd
    EndIf
    FileClose($fh)
    $ARRAY = $AR
    Return -1
    EndFunc ;==>_FileReadToArray2D

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

    ;==========================================================================================================================================
    ; Function: _FileWriteFromArray2D($FILEPATH, $ARRAY [, $iROWstart=0 [, $iROWend=0 [, $iCOLstart=0 [, $iCOLend=0 [, $DELIM='|']]]]])
    ;
    ; Description: Write 1D/2D array to file, 2D with delimiter between every entry
    ;
    ; Parameter(s): $FILEPATH - path/filename of the file to be write
    ; $ARRAY - array to write from
    ; optional $iROWstart - start row-index, default 0
    ; optional $iROWend - end row-index, default Ubound(array)-1
    ; optional $iCOLstart - start column-index, default 0
    ; optional $iCOLend - end column-index, default Ubound(array,2)-1
    ; optional $DELIM - delimiter for 2D-array entries, default '|'
    ;
    ; Requirement(s): None
    ;
    ; Return Value(s): On Success - Returns -1
    ; On Failure - Returns 0 and sets @error = 1 (given array is'nt array); @error = 2 (unable to open filepath)
    ;
    ; Note: If $iROWstart > $iROWend or $iCOLstart > $iCOLend the values will be swapped among
    ;
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ;==========================================================================================================================================
    Func _FileWriteFromArray2D($FILEPATH, $ARRAY, $iROWstart=0, $iROWend=0, $iCOLstart=0, $iCOLend=0, $DELIM='|')
    If Not IsArray($ARRAY) Then
    SetError(1)
    Return 0
    EndIf
    Local $Ubound = UBound($ARRAY)
    If $iROWend = 0 Then $iROWend = $Ubound-1
    Local $fh = FileOpen($FILEPATH, 2)
    If $fh = -1 Then
    SetError(2)
    Return 0
    EndIf
    Select
    Case $iROWstart < 0 Or $iROWstart > $Ubound-1
    $iROWstart = 0
    ContinueCase
    Case $iROWend < 0 Or $iROWend > $Ubound-1
    $iROWend = $Ubound-1
    ContinueCase
    Case $iROWstart > $iROWend
    $tmp = $iROWstart
    $iROWstart = $iROWend
    $iROWend = $tmp
    EndSelect
    Local $Ubound2nd = UBound($ARRAY, 2)
    If @error = 2 Then
    For $i = $iROWstart To $iROWend
    FileWriteLine($fh, $ARRAY[$i])
    Next
    Else
    If $iCOLend = 0 Then $iCOLend = $Ubound2nd-1
    Select
    Case $iCOLstart < 0 Or $iCOLstart > $Ubound2nd-1
    $iCOLstart = 0
    ContinueCase
    Case $iCOLend < 0 Or $iCOLend > $Ubound2nd-1
    $iCOLend = $Ubound2nd-1
    ContinueCase
    Case $iCOLstart > $iCOLend
    $tmp = $iCOLstart
    $iCOLstart = $iCOLend
    $iCOLend = $tmp
    EndSelect
    For $i = $iROWstart To $iROWend
    $tmp = ''
    For $k = $iCOLstart To $iCOLend
    If $k < $iCOLend Then
    $tmp &= $ARRAY[$i][$k] & $DELIM
    Else
    $tmp &= $ARRAY[$i][$k]
    EndIf
    Next
    FileWriteLine($fh, $tmp)
    Next
    EndIf
    FileClose($fh)
    Return -1
    EndFunc ;==>_FileWriteFromArray2D

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