*.txt Datei auslesen & "auswerten"

  • Hallo,
    habe ein ziemlich aufwendiges Problem, welches ich mit Autoit zu lösen versuchen will..
    Allerdings weiß ich überhaupt nicht, wie..

    Die Textdatei ist so aufgebaut:

    Code
    <marker id="7" type="cylinder" color="#FF000099" size="4" interior="0" dimension="0" posX="-2861.3000488281" posY="-905.09997558594" posZ="8.1999998092651" rotX="0" rotY="0" rotZ="0"></marker>

    So..Problem ist:

    Ich brauche nur den Wert von "posX", "posY", "posZ" - am besten in diesem Format: [posX], [posY], [posZ]
    In diesem Beispiel wäre es dann: -2861.3000488281, -905.09997558594, 8.1999998092651

    Dies ist auch in mehreren Zeilen - heißt, es soll dann den nächsten Marker finden und das gleiche in der nächsten Zeile machen - am besten in einem neuen Textdokument alles.

    Geht es evtl. sogar, dass das Script die marker-Zeilen raussucht und das nur dort dann macht?

    Bin froh über alle Lösungsvorschläge und Hilfen..
    Gruß

    Einmal editiert, zuletzt von Deep Volcano (23. Juni 2012 um 00:50)

  • Würde sagen folgende Befehle sollten dir da helfen:

    [autoit]

    _FileReadToArray
    _ArraySearch
    _StringBetween

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Kann mir jemand ein kleines Beispiel geben?
    Werde nicht schlau aus den Hilfethemen..

  • So müsste es funktionieren, habs jetzt nicht getestet.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>

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

    Global $aSB_1 = _StringBetween(FileRead("deine Datei"), "<marker>", "</marker>")
    Global $aRet[UBound($aSB_1)][3]
    Global $aSB_2

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

    For $i = 0 To UBound($aSB_1) - 1
    $aSB_2 = _StringBetween($aSB_1[$i], 'posX="', '"')
    $aRet[$i][0] = $aSB_2[0]
    $aSB_2 = _StringBetween($aSB_1[$i], 'posY="', '"')
    $aRet[$i][1] = $aSB_2[0]
    $aSB_2 = _StringBetween($aSB_1[$i], 'posZ="', '"')
    $aRet[$i][2] = $aSB_2[0]
    Next

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

    _ArrayDisplay($aRet)

    [/autoit]
  • Zeile 5 - Anstatt "<marker>" sollte es "<marker" heißen, da es sich noch nicht schließt.
    Und die _StringBetween-Funktionen kann man durch ein kleines RegExp ersetzen.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>

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

    Global $aSB = _StringBetween(FileRead("deine Datei"), "<marker", "</marker>")
    Global $aRet[UBound($aSB)][3]

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

    For $i = 0 To UBound ($aSB) - 1
    $aReg = StringRegExp ($aSB[$i], 'pos.="(.+?)"', 3)
    For $j = 0 To 2
    $aRet[$i][$j] = $aReg[$j]
    Next
    Next

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

    _ArrayDisplay($aRet)

    [/autoit]
  • Ah war nen Tippfehler ^^. Jo hatte ich versucht. Den Punkt nach pos hab ich vergessen ;). So ist es natürlich besser.


  • Und die _StringBetween-Funktionen kann man durch ein kleines RegExp ersetzen.

    Dir ist aber schon bewusst, das _StringBetween intern auch einfach ein RegExp macht und daher in diesem Fall ein manuelle RegExp komplett unnötig ist ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Dir ist aber schon bewusst, das _StringBetween intern auch einfach ein RegExp macht und daher in diesem Fall ein manuelle RegExp komplett unnötig ist ;).

    Ja, ist mir klar. Doch damit sieht es schöner aus und ist auch etwas kürzer.
    Ein StringRegExp ist auch etwa 67% schneller...

    • Offizieller Beitrag

    Oder so:

    [autoit]


    $string = '<marker id="7" type="cylinder" color="#FF000099" size="4" interior="0" dimension="0" posX="-2861.3000488281" posY="-905.09997558594" posZ="8.1999998092651" rotX="0" rotY="0" rotZ="0"></marker>' & @CRLF & '<marker id="7" type="cylinder" color="#FF000099" size="4" interior="0" dimension="0" posX="-2861.3000488281" posY="-905.09997558594" posZ="8.1999998092651" rotX="0" rotY="0" rotZ="0"></marker>' & @CRLF & '<marker id="7" type="cylinder" color="#FF000099" size="4" interior="0" dimension="0" posX="-2861.3000488281" posY="-905.09997558594" posZ="8.1999998092651" rotX="0" rotY="0" rotZ="0"></marker>' & @CRLF
    $out = StringRegExpReplace($string, '<marker.+posX="(.+?)" posY="(.+?)" posZ="(.+?)".+</marker>', '$1, $2, $3')
    ConsoleWrite($out & @CR)

    [/autoit]
  • Danke für alle Antworten bisher. ;)
    Hab nun das von $var mal versucht ..
    Komplettes Script:

    [autoit]

    #include <GUIConstants.au3>
    #include <file.au3>
    #include <Array.au3>
    #include <String.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Marker auslesen", 625, 154, 193, 125)
    $Group1 = GUICtrlCreateGroup(" Zu lesende Datei wählen ", 8, 24, 609, 49)
    $Datei = GUICtrlCreateInput("", 32, 40, 521, 21)
    $Button1 = GUICtrlCreateButton("...", 568, 40, 41, 25, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Start = GUICtrlCreateButton("Start", 8, 88, 609, 33, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $DateiDialog = FileSaveDialog("Datei auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "Alle Dateien (*.*)")
    GUICtrlSetData($Datei, $DateiDialog)
    Case $Start
    Global $aSB = _StringBetween(FileRead($Datei), "<marker", "</marker>")
    Global $aRet[UBound($aSB)][3]

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

    For $i = 0 To UBound ($aSB) - 1
    $aReg = StringRegExp ($aSB[$i], 'pos.="(.+?)"', 3)
    For $j = 0 To 2
    $aRet[$i][$j] = $aReg[$j]
    Next
    Next

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

    _ArrayDisplay($aRet)

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

    EndSwitch
    WEnd

    [/autoit]

    Fehler:

    Code
    (Speicherort) (28) : ==> Array variable subscript badly formatted.:
    Global $aRet[UBound($aSB)][3]
    Global $aRet[^ ERROR
    ->15:39:24 AutoIT3.exe ended.rc:1
    >Exit code: 1    Time: 6.521
  • Du musst auch das Input mit GUICtrlRead auslesen. Und ein Error-Handling solltest du auch einbauen.

  • Du musst auch das Input mit GUICtrlRead auslesen. Und ein Error-Handling solltest du auch einbauen.

    Danke. ;)
    Geht nun alles.

    Nun noch eine Frage..

    [autoit]

    $MsgBox = MsgBox(4+32, "", "In Textdatei schreiben?")
    If $MsgBox = 6 Then
    ShellExecute("Notepad")
    EndIf

    [/autoit]

    Was ich da bei nem Klick auf "Ja" haben will, ist, dass er im besagten Format - x, y, z - in ein Textdokument alles schreibt (Zeile für Zeile).
    Geht das irgendwie?
    Hab paar Versuche gemacht, hat aber nichts geklappt..

  • [autoit]

    $MsgBox = MsgBox(4+32, "", "In Textdatei schreiben?")
    If $MsgBox = 6 Then
    $sPath = @ScriptDir & "\coord.txt"
    For $i = 0 To UBound ($aRet) - 1
    FileWrite ($sPath, $aRet[$i][0] &", "& $aRet[$i][1] &", "& $aRet[$i][2])
    Next
    EndIf

    [/autoit]