das ist der Fehler der kommt
Ach ja, hatte ich übersehen:
Statt
To UBound($aResult)
[/autoit]musst du
[autoit]To UBound($aResult) -1
[/autoit]verwenden.
das ist der Fehler der kommt
Ach ja, hatte ich übersehen:
Statt
To UBound($aResult)
[/autoit]musst du
[autoit]To UBound($aResult) -1
[/autoit]verwenden.
das problem ist nun wenn ein SubArray leer ist
SubArray bedeutet Array im Array - und du prüfst ja auch mit IsArray ==> du hast aber nur ein 2D-Array mit normalen Einträgen.
Also nur auf Inhalt prüfen:
[autoit]; _ArrayDisplay($aResult)
For $i = 1 To UBound($aResult)
If $aResult[$i][4] <> '' Then _ArrayAdd($ARRAY, $aResult[$i][4])
Next
If UBound($ARRAY) - 1 <> 0 Then
For $i = 1 To UBound($ARRAY) - 1
_GUICtrlListView_AddItem($ListView1, $ARRAY[$i])
Next
EndIf
Dein Code ist nicht wirklich aussagefähig. Du sprichst von Array im Array - ich hab keine Ahnung woher das kommen soll. Insofern war mein Hinweis auch eher rudimentär.
If IsArray($aResult[$i][4]) <> '' Then
[/autoit]Du willst prüfen ob im Array ein Array ist. Diese Prüfung gibt aber nur 1 oder 0 zurück. Deine Prüfung auf "<> ''" ist also falsch. Verwende:
[autoit]If Not IsArray($aResult[$i][4]) Then
[/autoit]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 ![]()
; === 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
; === 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
; === Array erstellen aus Datei
Local $aD1 = StringSplit($file, @CRLF, 1), $aLine, $aData
Local $array3D[$aD1[0]][3][3]
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
ConsoleWrite(@CRLF & 'Jetzt 4D-Array' & @CRLF & @CRLF)
$aD1 = StringSplit($file2, @CRLF, 1)
Local $array4D[$aD1[0]][3][3][2], $iD2, $iD3
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
In die Datei zu Schreiben ist dann einfach nur die Umkehrung des obigen Codes.
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):
Local $aInfo['Anzahl der Funktionen'][11]
Local $path = 'Dateipfad'
Local $tmp, $sWrite = ''
Local $Delim = ';' ; dein gewünschtes Trennzeichen
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
FileWrite($path, $sWrite)
[/autoit]Aber das Wiedereinlesen würde sicher eine Katastrophe
.
Arbeite doch von Anbeginn mit einer SQLite-DB.
Alternativ (würde ich bevorzugen):
[autoit]Local $a = 4, $b = 3
[/autoit][autoit][/autoit][autoit]ConsoleWrite(' a + b = ' & _Calc($a, $b, 1) & @CRLF)
[/autoit][autoit][/autoit][autoit]ConsoleWrite(' a - b = ' & _Calc($a, $b) & @CRLF)
[/autoit][autoit][/autoit][autoit]Func _Calc($Val1, $Val2, $Operand=-1)
Return $Val1 + $Val2 * $Operand
EndFunc
- Freiwillige Tätigkeit
gepostet in Forum: ../AutoIt 3/Jobbörse
Was ist an dem Forumsnamen so mißverständlich? Hier wird gehandelt: Suche.. Biete.
[verschiebe nach: ..\Projekte]
Hab jetzt noch nicht nachgeschaut - hast du auch die strafverschärfende Tatbestände berücksichtigt?( z.B. 2-mal innerhalb von 12 Monaten außerorts >21 km/h zu schnell ==> Fahrverbot 4 Wochen)
Gibt da noch einiges mehr.
Nach 8 Punkten gibts auch noch ein kostenpflichtiges Info-Schreiben (Sie haben jetzt 8 Punkte. Mit dem Besuch von kostenpflichtigen Seminaren können Sie einmalig Punkte abbauen....)
Mehrstufig sortieren kannst du über einen Umweg mit SQL: https://autoit.de/index.php?page…46336#post46336
so:
[autoit]$muster1 = '-abc2456gjs-'
$muster2 = '-12345678-'
$ret = StringRegExpReplace($muster1, '-(\d*)-', '$1')
ConsoleWrite($ret & @crlf)
$ret = StringRegExpReplace($muster2, '-(\d*)-', '$1')
ConsoleWrite($ret & @crlf)
und einziger nachteil ist egtl das es langsamer ist als z.b. die string... funktionen
Nicht generell - komplexe StringRegExReplace sind deutlich schneller als vergleichbare Stringbefehl Konstrukte. Nach meiner Erfahrung nimmt vergleichsweise die Geschwindigkeit von RegExp deutlich zu, je länger der Text wird.
Zeilen und Spalten kannst du automatisch abfragen, habs mal angepaßt.
#include <Array.au3>
Local $oWord = ObjCreate("Word.Application")
$oWord.Visible = False
Local $oDoc = $oWord.Documents.Open ('C:\tabelle.doc')
Local $zeilen = $oDoc.Tables(1).Rows.Count
Local $spalten = $oDoc.Tables(1).Columns.Count
Local $array[$zeilen][$spalten]
Local $txt
For $i = 1 To $zeilen
For $j = 1 to $spalten
$txt = StringTrimRight($oDoc.Tables(1).Cell($i, $j).Range.Text, 2)
$array[$i-1][$j-1] = $txt
Next
Next
;~ _ArrayDisplay($array)
[/autoit] [autoit][/autoit] [autoit]$oDoc.Close
$oWord.Quit
ZitatWie bekomm ich es jetz hin, dass er Word nicht öffnet?
Gar nicht ![]()
Word muß ja geöffnet werden - nur halt nicht sichtbar. Für das Word Objekt gibt es da nur: $object.Visible = False
Kann mir nicht vorstellen, dass das fehlschlägt. Welche Office Version hast du denn?
Ganz simpel:
[autoit]#include <Array.au3>
$oWord = ObjCreate("Word.Application")
$oWord.Visible = False
$oDoc = $oWord.Documents.Open ('C:\Dein_Pfad.doc')
Local $array[10][5] ; hier die Größe deines Ziel-Arrays [Zeilen][Spalten] eintragen
Local $txt
For $i = 1 To 10 ; entsprechend Zeilenzahl
For $j = 1 to 5 ; entsprechend Spaltenzahl
$txt = StringTrimRight($oDoc.Tables(1).Cell($i, $j).Range.Text, 2)
; ConsoleWrite($txt & @CRLF)
$array[$i-1][$j-1] = $txt
Next
Next
$oDoc.Close
$oWord.Quit
Erweiterung:
Der zu prüfende String kann jetzt auch Zeilenumbrüche (@CR oder @CRLF) enthalten.
s. Post1
\s = Leerzeichen
Zeilenumbruch (CRLF) wird mit \r\n maskiert.