2D-Array - Array in Array?

  • Hallo liebe Community.
    Ich sitze gerade wieder vor einem Problem. Musste ich micht gestern noch mit 1D-Array rumschlagen, sind heute
    die 2D-Arrays an der Reihe. Mein Problem ist, dass ich nicht weiß, wie ich Textdateien in ein Array 2D Array einlesen kann.

    Meine gelesen zu haben, dass man die Textdateien jeweils in ein Array packt und dann diese Arrays in das 2D-Array.
    Oder ist das Mumpitz? Ein weiteres Problem: Ich kenne zwar die Spaltenzahl (3) aber nicht die Zeilenzahl.

    Einmal editiert, zuletzt von Scritch (11. Oktober 2010 um 12:42)

  • Hi!

    Erstmal ist es nicht schön zwei Post zu dem selben Thema zu machen!
    Und die Hilfe......
    Steht das :

    [autoit]

    _FileReadToArray

    [/autoit]


    um mehr zu erfahren soltest du genauer werden! ;)

    LG Kleiner

  • Hallo scritch,

    du liest deine Textdatei (CSV?) ganz normal mit _FileReadToArray ein, damit hast du alle Zeilen in einem Array. Falls [eingefügt] die Spaltenanzahl [/eingefügt] nicht [eingefügt] bekannt [/eingefügt] zerlegts du die 1. Zeile mit Stringsplit anhand des Feldtrenners in die einzelnen Felder. Aufgrund der Zeilen- und Feldanzahl kannst du jetzt ein neues 2d-Array erstellen. Mit For ... Next liest du alle Zeilen deines 1D-Arrays, splittest und trägst die Felder in dein 2D-Array. Fertig!

    Edit1: Redim ginge natürlich auch

    Edit2: hier ein Beispiel

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    $a1D = ""
    _FileReadToArray(@ScriptDir & "\NeMP3-P_Music.dat", $a1D)
    If IsArray($a1D) Then
    _ArrayDisplay($a1D,"Ursprung")
    $aFields = StringSplit($a1D[1], "|")
    If $aFields[0] > 1 Then
    Global $a2D[$a1D[0]][$aFields[0]]
    For $i = 1 To $a1D[0]
    $aFields = StringSplit($a1D[$i], "|")
    For $j = 1 To $aFields[0]
    $a2D[$i-1][$j-1] = $aFields[$j]
    Next
    Next
    EndIf
    EndIf
    _ArrayDisplay($a2D,"gesplittet")

    [/autoit]

    meine Datei zum Testen:

    Spoiler anzeigen
    Code
    Wise Man - Uriah Heep||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Wise Man - Uriah Heep.mp3
    Come Back to Me by URIAH HEEP, a must watch-listen powerful piece||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Come Back to Me by URIAH HEEP, a must watch-listen powerful piece.mp3
    Lady in Black - Uriah Heep||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Lady in Black - Uriah Heep.mp3
    Lovely Days 2010 - Uriah Heep 16.mp4||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Lovely Days 2010 - Uriah Heep 16.mp4.mp3
    Manfred Mann & Uriah Heep||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Manfred Mann & Uriah Heep.mp3
    Stealin' Uriah Heep Live Stealin Stealing||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Stealin' Uriah Heep Live Stealin Stealing.mp3
    Tears in My Eyes - Uriah Heep||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Tears in My Eyes - Uriah Heep.mp3
    Uriah Heep - Angel||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Uriah Heep - Angel.mp3
    Uriah Heep - Bird of Prey||C:\Programme\AutoIt3\MyProjects\MP3_Batchdownloader\Downloaded\Uriah Heep\Uriah Heep - Bird of Prey.mp3


    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (30. September 2010 um 17:46) aus folgendem Grund: Beispiel angehängt

  • Guten Morgen,
    und sorry für den Doppelpost. Ein Fehlermeldung wurde mir nach dem Erstellen des ersten Threads ausgegeben -
    da bekam ich einen nervösen Zeigefingen.

    Danke erstmal für eure Antworten. Habe mich in der Tat etwas undeutlich ausgedrückt. Schlechte Angewohnheit...
    Es ist nicht eine Datei die in mehrere Spalten gesplittet werden soll, sondern 3 Dateien, die jeweils in eine Spalten
    sollen. Nachher ist es halt so, dass ein Element 3 Werte hat. Dabei weiss ich halt, dass es immer 3 Spalten sind,
    aber nie genau, wieviele Zeilen.

    Was die Sache vll. auch noch schwieriger macht ist, dass in der ersten Datei (es sind btw alles .ini-Dateien) die in
    die erste Spalte soll, in jeder Zeile mehrere Wörter und auch Sonderzeichen vorhanden sind. Ignoriert
    _FileReadToArray das?

    So, hoffe das war jetz etwas präziser :)

  • So, hoffe das war jetz etwas präziser :)

    Naja nicht wirklich. Am besten wäre:
    -Die Dateien hochladen (oder abgeänderte Dateien wegen Datenschutz)
    -genau angeben wie das Array aussehen soll z.B.

    [autoit]


    $array[x] = Datei1 Zeile x|Datei2 Zeile x|Datei3 Zeile x
    ; oder
    $array[x][0] = Datei1 Zeile x
    $array[x][1] = Datei2 Zeile x
    $array[x][2] = Datei3 Zeile x

    [/autoit]
    Zitat

    Ein Fehlermeldung wurde mir nach dem Erstellen des ersten Threads ausgegeben -

    Wie schon im anderen Thread beschrieben:

    Zitat

    Bitte schon bisschen Lesen was da drinsteht^^
    Das is nämlich keine Fehlermeldung gewesen sondern eine Benachrichtigung.
    Müsste in etwa sowas stehen wie: Der Thread muss erst von einem Administrator freigeschalten werden
    (das ist bei neuen Usern so weil viele sich angemeldet haben um irgendwelche Werbung zu posten oder sich einfach nicht an die Forenregeln hielten)

  • Okay.
    Vorweg: Ich habe hier was gefunden, was mir vll. hilfreich sein könnte:

    Code
    Func _FileReadToArray2D


    Und noch was anderes vorweg: Wie kann ich einen Quelltext in einen Spoiler packen?

    So, nun zum eigentlichen Problem:
    Inhalt eins.ini:

    wort1 wort 2; wort3 (wort4)
    wort5 Wort6
    wort7:wort8 & wort9

    Halt mit mehr als einem Wort in einer Zeile und auch mit Sonderzeichen versehen.
    Diese soll NICHT gesplittet werden, sondern so wie sie ist in die erste Spalte.

    Inhalt zwei.ini:

    Wort1
    Wort2
    Wort3

    Kommt in Spalte 2, je ein Wort in eine Zeile.

    Inhalt drei.ini:

    Wort1
    Wort2
    Wort3

    Kommt in Spalte 2, je ein Wort in eine Zeile.


    Noch was anderes: Sucht _ArraySearch auch Sonderzeichen?

    Das mit den Doppelposts kommt nicht wieder vor :)

  • Spoiler machst du mit diesem Icon: [Blockierte Grafik: http://www.autoit.de/wcf/icon/wysiwyg/insertSpoilerM.png]
    Also einfach [S poiler][a utoit][/a utoit][S poiler] (ohne die leerzeichen^^)

    also haben die ini's keinen Standard ini Aufbau?

    also so:

    Code
    [Sektion]
    Key=Wert
  • Wenn ich sie mit dem Editor öffne, dann werden sie nach dem Prinzp angezeigt, wie ich es geschrieben habe ;)

    Augen auf beim Fensterkauf. Den Button habe ich nicht gesehen... narf :whistling:
    Was sagst du zu _FileReadToArray2d?

  • Hi!

    Ich würde dir Empfehlen

    [autoit]

    IniReadSection

    [/autoit]


    zu nutzen, du läst eine Section auslesen und bekommst ein 2 Dimension Array zurück:

    [autoit]

    Eine standardkonforme .ini-Datei sieht folgendermaßen aus:
    [SektionsName]
    Schlüssel=Wert

    [/autoit]


    Das Array kannst du dann an deine wünsche anpassen wie das beispiel in der hilfe zeigt:

    [autoit]

    $var = IniReadSection("C:\Temp\meineDatei.ini", "sektion2")
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Warscheinlich keine INI Datei vorhanden.")
    Else
    For $i = 1 To $var[0][0]
    MsgBox(4096, "", "Schlüssel: " & $var[$i][0] & @CRLF & "Wert: " & $var[$i][1])
    Next
    EndIf

    [/autoit]


    du brauchst jetzt nur noch ein Array zu deklarieren nach deinen wünschen und die jeweiligen werte zuweisen.
    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $var = IniReadSection(@ScriptDir & '\test.ini', 'test')

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

    Dim $aNewArray[UBound($var) - 1][3]

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

    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Warscheinlich keine INI Datei vorhanden.")
    Else
    For $i = 1 To $var[0][0]
    $aNewArray[$i - 1][0] = $var[$i][0] & ' Schlüssel'
    $aNewArray[$i - 1][1] = $var[$i][1] & ' Wert'
    $aNewArray[$i - 1][2] = $i
    MsgBox(4096, "", "Schlüssel: " & $var[$i][0] & @CRLF & "Wert: " & $var[$i][1])
    Next
    EndIf

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

    _ArrayDisplay($aNewArray)

    [/autoit]

    zu den Quellcode erstellen gibt es oben rechts (SP) für Spoiler und das AutoIT Logo für den Quelltext

    Edit:/ da wahr ich aber langsam :D

    LG Kleiner

  • IniRead wird hier nichts helfen da es keine Standard Ini's sind

    so würds aber gehen:
    (ist quick and dirty und einige Fehlerabfragen sollten noch rein)

    Spoiler anzeigen
    [autoit]

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

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

    Dim $File1, $File2, $File3
    _FileReadToArray(@ScriptDir & "\eins.ini", $File1)
    _FileReadToArray(@ScriptDir & "\zwei.ini", $File2)
    _FileReadToArray(@ScriptDir & "\drei.ini", $File3)

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

    $kleinste = $File1[0]
    If $File2[0] < $kleinste Then $kleinste = $File2[0]
    If $File3[0] < $kleinste Then $kleinste = $File3[0]

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

    Dim $Files2d[$kleinste+1][3]

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

    For $i = 1 To $kleinste
    $Files2d[$i][0] = $File1[$i]
    $Files2d[$i][1] = $File2[$i]
    $Files2d[$i][2] = $File3[$i]
    Next

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

    $Files2d[0][0] = $kleinste

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

    _ArrayDisplay($Files2d)

    [/autoit]
  • Problem ist, dass es in meiner .ini keine Sectionen gibt.
    Es steht alles so drin, wie es in einer normalen Textdatei steht.

    Wie sollte ich denn vorgehen, wenn ich die .ini wie eine normale
    .txt behandeln wollte?

  • Habs gerade gesehen und auch ausprobiert. So solls sein, vielen Dank erstmal für eure Hilfe.

    Allerdings verstehe ich nocht nicht ganz, was da passiert.

    Bis Zeile 7 ist es mir ja klar, aber dann hörts auch schon auf ?(

    Was machst du z. B. mit

    [autoit]

    $kleinste = $File1[0]

    [/autoit]

    und warum die 0 in den eckigen Klammern?

  • Hi!

    [autoit]

    Dim $File1, $File2, $File3

    [/autoit]


    Sind zuertst ganz normale Variablen und werden bei Funktionverarbeitung zum Array

    [autoit]

    _FileReadToArray(@ScriptDir & "\eins.ini", $File1)
    _FileReadToArray(@ScriptDir & "\zwei.ini", $File2)
    _FileReadToArray(@ScriptDir & "\drei.ini", $File3)

    [/autoit]

    Edit:/ Lehrnstunde Schau mal hir BugFix Array Tut

    LG Kleiner

  • Das war das was mir klar war :D Bis Zeile 7 alles klar, danach nicht mehr so ;)

    Edit: okay, habe 9 - 1 verstanden was er macht, aber nicht warum er es macht.

    [autoit]


    $kleinste = $File1[0] ;Weist der $kleinste die File1 zu (Wozu aber [0]?)
    If $File2[0] < $kleinste Then $kleinste = $File2[0] ;Ist File2 kleiner als $kleinste, dann weise $kleinste File2 zu.
    If $File3[0] < $kleinste Then $kleinste = $File3[0] ;hier nochmal dasselbe...

    [/autoit]

    Ralle ich nicht...

    Einmal editiert, zuletzt von Scritch (1. Oktober 2010 um 10:37)

  • Auskennen wäre zuviel gesagt. Ich habe vor 10 Tagen das erste Mal wirklich ein Array benutzt ^^

    Edit: Also, ich habe mich bisher nur mit Arrays befasst, wo der Wert der in dem Array stehen soll,
    aus einer externen Datei stammte. Das war bisher das einzige. In der deutschen Help steht zu
    2d-Arrays auch nichts was zu gebrauchen ist.

  • Ok. Also diese 3 Zeilen:

    [autoit]

    $kleinste = $File1[0]
    If $File2[0] < $kleinste Then $kleinste = $File2[0]
    If $File3[0] < $kleinste Then $kleinste = $File3[0]

    [/autoit]


    Sind eigentlich nur um Fehlern aus dem Weg zu gehen.
    Kurz gesagt schaue ich welche datei am wenigsten Zeilen hat. und nehme das dann als Grenze für unser 2D-Array.

    Wenn deine txt-Files alle gleichviele Zeilen haben dann geht das genauso:

    Spoiler anzeigen
    [autoit]

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

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

    Dim $File1, $File2, $File3
    _FileReadToArray(@ScriptDir & "\eins.ini", $File1)
    _FileReadToArray(@ScriptDir & "\zwei.ini", $File2)
    _FileReadToArray(@ScriptDir & "\drei.ini", $File3)

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

    Dim $Files2d[$File1[0]][3]

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

    For $i = 1 To $File1[0]
    $Files2d[$i-1][0] = $File1[$i]
    $Files2d[$i-1][1] = $File2[$i]
    $Files2d[$i-1][2] = $File3[$i]
    Next

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

    _ArrayDisplay($Files2d)

    [/autoit]

    Aber ich denke ich mach ne vernünftige Funktion daraus, dann wirds einfacher ;)

  • Achso, alles klar!
    Soweit jedenfals. Hatte ich nicht erwähnt aber ja, die Dateien haben
    gleich viele Zeilen. Wozu aber [0]? Das würde ich noch gerne wissen.

    Zuuterletzt jetzt noch die Schleife.

    [autoit]


    For $i = 1 To $File1[0]
    $Files2d[$i-1][0] = $File1[$i] ;Schreibt Dateien aus File1 in Spalte1
    $Files2d[$i-1][1] = $File2[$i] ;Schreibt Dateien aus File2 in Spalte2
    $Files2d[$i-1][2] = $File3[$i] ;Schreibt Dateien aus File3 in Spalte3
    Next

    [/autoit]

    Erkläre mir aber doch mal bitte, was genau

    [autoit]

    $Files2d[$i-1][0] = $File1[$i]

    [/autoit]

    macht :)
    Also, prinzipiell klar, aber im einzelnen noch nicht so.

  • Hi!

    Array ist schon ein Komplexes Arbeits fehlt ich würde dir empfehlen den Link von mir in Post 14 zu nutzen, ist nicht leicht das in Kurzen worten zu fassen.

    LG