textfile (komma separiert) in ein 2d Array einlesen

  • Hallo zusammen,

    ich stehe im Augenblick etwas auf dem Schlauch und komme nicht so recht weiter.
    Daher erhoffe ich mir hier einen Tip o.ä.


    Im Zuge einer Auswertung eines grossen Textfiles komme ich an eine Stelle in der ich gerne ein Textfile in ein Array einlesen muss (wie das funktioniert weiss ich)
    Die ieinzulesende Datei hat nach mehreren 'grep' Aktionen folgendes Format (stark vereinfacht)

    Angela Merkel, AR12345
    Guido Westerwelle, GR84029
    Phillip Roesler, PR75375
    ....

    Jetzt kann ich diese natürlich mittels _FileReadToArray einlesen was zu u.a. Ergebnis führt:

    [0]|3
    [1]|Angela Merkel, AR12345
    [2]|Guido Westerwelle, GR84029
    [3]|Phillip Roesler, PR75375
    ....


    ich hätte es aber viel lieber bzw. um den weiteren Fortgang rel. einfach umsetzen zu können, wäre folgende Form die Lösung meines Problems.
    (denn dann könnte ich auf die jeweiligen Elemente des Arrays direkt zugreifen und müsste nicht Nachgang das Ganze wieder auseinander'schneiden')

    [0][0]|3
    [1][0]|Angela Merkel
    [1][1]|AR12345

    [2][0]|Guido Westerwelle
    [2][1]|GR84029

    [3][0]|Phillip Roesler
    [3][1]|PR75375

    und da klemmst es jetzt bei mir :(


    Danke schon mal im voraus

    mfg
    ugt100

    Einmal editiert, zuletzt von ugt100 (11. April 2013 um 21:37)

  • geht doch :D

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $sFile = FileRead("blabla.txt") ; Datei einlesen
    $sFile = StringReplace($sFile,@CRLF,@LF) ; Alle Zeilenumbrücje in @LF ändern
    $sFile = StringReplace($sFile,@CR,@LF) ; Alle Zeilenumbrücje in @LF ändern
    Global $aSplit = StringSplit($sFile,@LF&",") ; Bei Komma und Zeilenumbruch spliten

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

    Global $aNamen[$aSplit[0]/2+1][2] ; Array erstellen
    $aNamen[0][0] = UBound($aNamen)-1 ; Anzahl in Array schreiben
    Global $i
    FOr $i=1 To UBound($aSplit)-1 Step 2 ; Werte in Array schreiben
    $aNamen[($i+1)/2][0] = $aSplit[$i]
    $aNamen[($i+1)/2][1] = $aSplit[$i+1]
    Next
    _ArrayDisplay($aNamen)

    [/autoit]


    Edit : Die Leerzeichen nach dem Komma musst du noch selbst einbauen, dass die entfernt werden

  • Hab hier auch was:

    Spoiler anzeigen
    [autoit]

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

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

    Global $hOpen, $asRead, $asTemp, $iCount, $asSplit

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

    $hOpen = FileOpen(@TempDir & '\MDaten.txt', 2)
    FileWrite($hOpen, 'Angela Merkel, AR12345' & @CRLF & _
    'Guido Westerwelle, GR84029' & @CRLF & _
    'Phillip Roesler, PR75375')
    FileClose($hOpen)

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

    _FileReadToArray(@TempDir & '\MDaten.txt', $asRead)
    _ArrayDisplay($asRead)
    FileDelete(@TempDir & '\MDaten.txt')

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

    $asTemp = $asRead
    ReDim $asRead[UBound($asRead)][2]
    $asRead[0][0] = UBound($asRead) - 1

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

    For $iCount = 1 To UBound($asRead) - 1
    $asSplit = StringSplit($asTemp[$iCount], ', ', 1)
    $asRead[$iCount][0] = $asSplit[1]
    $asRead[$iCount][1] = $asSplit[2]
    Next

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

    _ArrayDisplay($asRead)

    [/autoit]
  • Hi Alcros,

    puh - das ist ja nicht ganz so trivial.
    Zu Meinem Verständnis, was da passiert:
    Zeilen 3 - 6 ---- da werden alle möglichen Zeichen ersetzt um einen einheitliche Darstellung zu erhalten und in ein Array eingelesen - soweit OK, verstanden
    Zeile 8 ---- Aufbau des 2d Arrays: da in $aSplit in Summe immer ungerade Anzahl an Elementen vorliegen muss -> $aSplit[0]/2+1 = gerade Anzahl(Paare) + [2]- soweit OK, verstanden
    Zeile 9 ---- Anzahl der 'Paare' ins Array schreiben- soweit OK, verstanden
    Zeile 11 ---- Schleife zum Auslesen des $aSplit --> Anzahl / immer im 2er Schritt
    Zeile 12 ---- Ins 2d Array schreiben: 1. Element Row1/Col1 (1+1)/2 = 1 also an Pos [1] + [0] = $aSplit[1], weil i=1
    Zeile 13 ----- Ins 2d Array schreiben: 1. Element Row1/Col2 (1+1)/2 = 1 also an Pos [1] + [1] = $aSplit[2], weil i=i+1=2
    Zeile 15 ------ Array anzeigen - soweit OK, verstanden

    Liege ich richtig ?
    Beim test erhalte ich leider den Fehler (den ich nicht erkenne) - ich habe eine Testfile mit 8 Elementen genutzt.
    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Danke auf alle Fälle

    Gruss
    ugt100

  • Dann ist der Dateipfad falsch x.x (Zeile 3)
    Um bei Alcros Skript noch die Leerzeile zu entfernen, ersetze Zeile 13 durch:

    [autoit]

    $aNamen[($i+1)/2][1] = StringTrimLeft($aSplit[$i+1],1)

    [/autoit]
  • Hallo

    erst einmal ein DANKE an alle di so schnell und kompettent geantwortet haben.
    Ich habe das ganze zwar noch nicht so ganz verdaut, denke aber das ich es verstehe.

    Desweiteren ist mir aufgefallen, dass ich offensichtlich eine Tatbestand meines TextFiles unterschätzt habe, der wohl doch zu Problemen führt.
    Ich hatte der Übersicht wegen das Textfile etwas gekürzt.

    In natura sieht das so aus (Canonischer Namen) + verursacht m.E. die Probleme:

    CN=Angela Merkel/OU=CDU/OU=Bundestag/O=BRD, AR12345
    CN=Guido Westerwelle/OU=FDP/OU=Bundestag/O=BRD, GR84029
    CN=Phillip Roesler/OU=FDP/OU=Bundestag/O=BRD, PR75375

    Kann das sein ?

    Asche auf mein Haupt - das war ziemlich ungeschickt - :cursing:


    DANKE
    mf
    ugt100

  • funktionieren tut mein Skript deswegen immer noch, du musst bei FileRead den Dateinamen natürlich anpassen
    sonst kommen außer die genannten ja keine Kommas vor ?
    Es könnte sein dass du Leerzeilen hast, hab mein Skript mal diesbezüglich angepasst

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $sFile = FileRead("z3.txt") ; Datei einlesen
    $sFile = StringReplace($sFile,@CRLF,@LF) ; Alle Zeilenumbrücje in @LF ändern
    $sFile = StringReplace($sFile,@CR,@LF) ; Alle Zeilenumbrücje in @LF ändern
    $sFile = StringRegExpReplace($sFile,"\n+","\n")
    Global $aSplit = StringSplit($sFile,@LF&",") ; Bei Komma und Zeilenumbruch spliten

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

    Global $aNamen[$aSplit[0]/2+1][2] ; Array erstellen
    $aNamen[0][0] = UBound($aNamen)-1 ; Anzahl in Array schreiben
    Global $i
    FOr $i=1 To UBound($aSplit)-1 Step 2 ; Werte in Array schreiben
    $aNamen[($i+1)/2][0] = $aSplit[$i]
    $aNamen[($i+1)/2][1] = $aSplit[$i+1]
    Next
    _ArrayDisplay($aNamen)

    [/autoit]
  • Hallo zusammen,

    so nun mit etwas Ruhe, kann ich vermelden, dass das ich im 1. Schritt das Script von Alcros nun zum Laufen gebracht habe.
    Warum ist mir noch nicht so ganz klar, aber da das $aSplit eine ungrade Anzahl Elemente listet, erklärt sich der Fehler im Nachgang (w/ DIV/2 ...).
    Mittels _ArrayPop($aSplit) klappt es dann !

    Anm.: Im QuellFile sehe ich nichts Fehlerhaftes - aber erstmal zweitrangig.

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

    #include <Array.au3>

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

    Global $sFile = FileRead("z3.txt") ; Datei einlesen
    $sFile = StringReplace($sFile,@CRLF,@LF) ; Alle Zeilenumbrüche in @LF ändern
    $sFile = StringReplace($sFile,@CR,@LF) ; Alle Zeilenumbrüche in @LF ändern
    Global $aSplit = StringSplit($sFile,@LF&",") ; Bei Komma und Zeilenumbruch splitten

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

    ArrayPop($aSplit); <----------------------- That's the clue

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

    Global $aNamen[$aSplit[0]/2+1][2] ; Array erstellen
    $aNamen[0][0] = UBound($aNamen)-1 ; Anzahl in Array schreiben
    Global $i
    FOr $i=1 To UBound($aSplit)-1 Step 2 ; Werte in Array schreiben
    $aNamen[($i+1)/2][0] = $aSplit[$i]
    $aNamen[($i+1)/2][1] = $aSplit[$i+1]
    Next
    _ArrayDisplay($aNamen)

    [/autoit]


    Nochmals vielen DANK an alle.
    Ich werde - wenn ich Zeit habe - die anderen Wege mir auch anschauen und ggf. im Forum entsprechende Infos/Antworten schreiben bzw. posten.


    mfg
    ugt100 :thumbup:

  • Nochmal ein hallo,

    erstens ein generelles Feedback:

    ich habe die angebotenenen Lösung durch gespielt und festgestellt, dass letztlich alle funktionieren (viele Wege führen nach Rom - oder so).
    Soweit sogut.

    Alerdings habe ich auch feststellen müssen, dass mein 'QuellFile' - wie auch immer - einen CRLF (glaube ich zumindest) als letztes Zeichen des Textfiles mitbringt.
    D.h. z.B. bei 23 Accounts die geliefert werden, sind es letztlich nicht 23 Datensätze=Zeilen sondern 23 +1.
    OK - im Prinzip nicht schlimm kann ich mittels $cdeLine = StringTrimLeft($cdeLine, $cdeTrim-1) abfangen.

    Vllt. ist es aber auch eine Idee das Quellfile nochmal zu überarbeiten, bevor es weiter prozessiert wird in ein xlm file.
    Wobei ich noch nicht so genau weiss was da sinnvoll ist ... @CRLF ist es sicherlich nicht.
    Nun gut ich werde sehen.


    Danke an alle -> Alcros, UEZ, Make-Grafik

    :rock: - :thumbup:

    Gruss
    ugt100