PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AutoIt Text zu Array



haggys22
24.10.2010, 21:38
Hallo,
ich möchte mir ein au3 Script programmieren, mit dem ich eine Textdatei einlese, jede einzelne Zeile in einem Array abspeichere, und dann am ";" jeweils die Zeile trennen.
Das Ergebnis soll eine 2D-Array sein, bei der die Werte ca so aussehen:
| 0 | 1
0 | Zeile 1 vor ";" | Zeile 1 nach ";"
1 | Zeile 2 vor ";" | Zeile 2 nach ";"
2 | Zeile 3 vor ";" | Zeile 3 nach ";"
3 | Zeile 4 vor ";" | Zeile 4 nach ";"
4 | Zeile 5 vor ";" | Zeile 5 nach ";"
...

Nach Erstellen der Array soll der Inhalt wie folgt in MsgBoxes ausgegeben werden:
[0][0], [0][1], [1][0], [1][1], [2][0], [3][1], ...
Mein Script bis jetzt:

#include <File.au3>
#include <Array.au3>
Dim $ar1
Dim $ar2
$file = "file.txt"
_FileReadToArray($file, $ar1)
For $i = 1 To $ar1[0]
$ar1[$i] = StringSplit($ar1[$i], ";")
Next
for $i = 1 to UBound($ar1)
$x = $ar1[$i]
$ar2[$i][1] = $x[1]
$ar2[$i][2] = $x[2]
Next
for $i = 1 to UBound($ar2, 2)
for $j to UBound($ar2, 1)
MsgBox(1, "Test", $ar2[$i][$j]
Next
Next


Wär nett wenn mir einer sagen könnte, warum das ganze nicht funktioniert.

Haggi

Mofo
25.10.2010, 08:00
Ich schau mir das später an, aber beim drüberfliegen würde ich sagen du solltest deine Arrays ersteinmal initialisieren und deren Größe festlegen..
Die musst du dann im verlauf dynamisch erweitern..

haggys22
25.10.2010, 12:51
Ich habe das ganze so gemacht, wie im AutoIt Wiki beschrieben:


Arrays als Elemente eines Arrays
Es ist möglich, innerhalb eines Arrays andere Arrays zu speichern. Das ist z.B. sinnvoll, wenn ich aus einer Datei Daten einlese, die innerhalb einer Zeile mehrere Werte getrennt durch Trennzeichen enthält. (z.B. CSV-Datei)
Unsere "muster.csv" könnte so aussehen:
1. Spalte;2. Spalte;3. Spalte;4. Spalte;5. Spalte
2. Zeile;1. Inhalt;2. Inhalt;3. Inhalt;4. Inhalt
3. Zeile;5. Inhalt;6. Inhalt;7. Inhalt;8. Inhalt
4. Zeile;9. Inhalt;10. Inhalt;11. Inhalt;12. Inhalt
So kann ich die Daten zur Weiterverarbeitung in ein Array einlesen:
#include <File.au3>
Dim $arCSV
$csvFile = "muster.csv"
_FileReadToArray($csvFile, $arCSV)
Im Element $arCSV[0] ist die Anzahl der Zeilen (= Array-Elemente) hinterlegt. Jedes Element in $arCSV enthält eine Zeile der Datei "muster.csv". Die einzelnen Werte sind durch ";" getrennt. Mithilfe von StringSplit() kann jetzt jeder Wert vereinzelt werden. Dabei wird der enthaltene String eines Elements durch das mit StringSplit() entstehende Array ersetzt.
For $i = 1 To $arCSV[0]
$arCSV[$i] = StringSplit($arCSV[$i], ";")
Next
StringSplit() liefert ein 1D-Array mit Angabe der enthaltenen Elemente an Pos[0]. Wenn ich nun auf das Element[3] der $arCSV zugreifen möchte und aus dem enthaltenen Array die Anzahl ausgeben will wäre dies also: $arCSV[3] ==> [0] Wie soll hier das Element abgefragt werden ? $arCSV[3][0] ==> Das wäre ein 2D-Array, das aber nicht vorliegt, also Falsch! ($arCSV[3])[0] ==> Das trennt zwar logisch, ist aber syntaktisch nicht möglich, auch Falsch! Hier gibt es nur den Weg über einen Zwischenschritt:
$x = $arCSV[3]
MsgBox(0,'', 'Anzahl dert Elemente von $arCSV[3]: ' & $x[0])

Deswegen bin ich ja auch etwas verwundert, warum das ganze nicht funktioniert...

Mofo
25.10.2010, 16:52
Ok die größe ist bei AutoIt ersteinmal unwichtig :P

Abgesehen davon das es einfacher geht, und du ein paar Syntaxfehler hast, denkst du richtig, allerdings kannst du nicht ein array in einen teil eines arrays speichern..

Und stringsplit gibt dir nunmal Drei werte als array zurück..
Das musst du separat behandeln..

haggys22
25.10.2010, 17:13
Arrays als Elemente eines Arrays
For $i = 1 To $arCSV[0]
$arCSV[$i] = StringSplit($arCSV[$i], ";")
Next

Das hab ich aus dem Wiki und so werden ja Arrays in einer Array gespeichert...

Mofo
25.10.2010, 17:20
Nein das geht nicht, oder nicht mehr..

Also ich würde es zwar gleich in ein 2D Array einlesen, aber es geht in dem Beispiel sicherlich nur um die Übung mit dem Umgang von Arrays , also hab ich dir jetzt mal eine Lösung gemacht so wie du vorgehen wolltest..


#include <File.au3>
#include <Array.au3>
Dim $ar1
$file = "file.txt"
$array = _FileReadToArray($file,$ar1)
_ArrayDisplay($ar1)
Dim $ar2[UBound($ar1)*2-1]
local $z=0
For $i = 1 To $ar1[0]
$j = StringSplit($ar1[$i],';')
$ar2[$i+$z] =$j[1]
$ar2[$i+$z+1] =$j[2]
$z+=1
Next
$ar2[0]= UBound($ar2)
_ArrayDisplay($ar2)

Dim $ar3[UBound($ar2)/2][2]
$z=1
for $i = 0 to UBound($ar2)/2-1
$ar3[$i][0] = $ar2[$i+$z]
$ar3[$i][1] = $ar2[$i+1+$z]
$z+=1
Next
_ArrayDisplay($ar3)
for $i = 0 to UBound($ar3,1)-1
for $j=0 to UBound($ar3, 2)-1
MsgBox(1, "Testausgabe an arraystelle :"&$i&'/'&$j, $ar3[$i][$j])
Next
Next

haggys22
25.10.2010, 21:49
Da kommt ein Fehler:


Line7 (File "C:\arraytest.au3"):

Dim $ar2[UBound($ar1)*2-1]
Dim $ar2[^ ERROR

Error: Array variable subscript badly formatted.

Woran kann das liegen, oder was bedeutet dieser Fehler überhaupt?

Mofo
25.10.2010, 22:24
Nun $ar1 (und damit dein file.Txt) sollte schon konform vorliegen sonst bricht das Programm natürlich ab :P
Ich bin nach deiner Beschreibung jetzt von einem txt dessen inhalt von diesem Format ist ausgegangen:

1111111111111111111111111;222222222222222222222222
333333333333333333333333;4444444444444444444444
555555555555555555555555555;666666666666666666
77777777777777777777777777;888888888888888888
999999999999999999999999;000000000000000000000

Und damit du auch verstehst was passiert wird das array doch jedesmal angezeigt..
Das zweite array sollte um das doppelte größer sein, da jeder teil des vorherigen ja in zwei geteilt wurde..
Das -1 deshalb da das array bei 0 anfängt und hier diesmal in 0 nicht die Größe von sich selbst steht

haggys22
26.10.2010, 11:17
ok jetzt hat er mir eine 1-D Array ausgegeben, wo jede Zeile einzeln gespeichert ist.
Danach kommt jetzt folgender Fehler:


Line12 (File "C:\arraytest.au3"):

$ar2[$i+$z+1] =$j[2]
$ar2[$i+$z+1] =^ ERROR

Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded.

Mofo
26.10.2010, 20:45
Also ich hatte hier eig nicht vor dir jede Zeile einzeln vorzukauen..

Das bedeutet das er versucht $j[2] zu laden das aber wohl nicht existiert..
das heist das dein dein Stringsplit nicht 3 Elemente zurückgegeben hat, was wiederum heist, dein txt das du benutzt ist nicht wie von dir beschrieben :/

Und da das eine Übungsaufgabe ist und du nichteinmal die einfachsten Zusammenhänge verstehst, rate ich dir dich ersteinmal mit leichterem zu beschäftigen..


Und wenn dein Script abbricht und du das nicht erwartest dann poste nicht jegliche Fehlermeldung hier, sondern bau Messageboxen und debugstrings ein, um zu sehen warum genau.. Das musst du ohnehin lernen

haggys22
26.10.2010, 21:48
Ok ich bin etwas dämlich...
Ich hatte als Trennzeichen ein anderes Zeichen in der txt, weil ich die txt nochmal abgeändert hab... bloß ich hab den Code einfach übernommen und vergessen des Zeichen auszutauschen o.0