StringRegExp Problem

    • Offizieller Beitrag

    Hier eine Lösungsvariante:

    [autoit]

    Local $aTest[7] = [ _
    'N182 G74 Z-1 L1', _
    'N183 G74 x200 Y-1 L1', _
    'N184 G7', _
    'N185 G93 X0 Y0 Z0', _
    'N186 S1800 T3 M6 (HM - Schlichtfraeser D=20,0)', _
    'N187 G39 C3=1', _
    'N188 G74 Z-1 L1']

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

    $pattern = '(T\d+)(?:[^(]*)([^)]*)'

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

    For $i = 0 To UBound($aTest) -1
    $ret = StringRegExp($aTest[$i], $pattern, 3)
    If @error Then ContinueLoop
    ConsoleWrite('Werkzeug: ' & $ret[0] & ' ' & $ret[1] & ')' & @CRLF)
    Next

    [/autoit]
  • Danke!!! Das passt jetzt schon fast, ich bekomme aber ein paar wenige falsche Ergenbnisse...

    Script:

    [autoit]


    #Include <GUIConstantsEx.au3>
    #Include <Array.au3>
    #Include <File.au3>
    #NoTrayIcon
    Opt("GUIOnEventMode", 1)
    $main=GUICreate("Werkzeugliste erstellen", 350, 85)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUIEvents")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_GUIEvents")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_GUIEvents")
    $edit=GUICtrlCreateInput("", 5, 5, 340)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $search=GUICtrlCreateButton("NC Programm suchen (.txt) ...", 5, 30, 340, 25)
    GUICtrlSetOnEvent(-1, "_fileOpen")
    $go=GUICtrlCreateButton("Werkzeugliste aus NC Programm erstellen ...", 5, 55, 340, 25)
    GUICtrlSetOnEvent(-1, "_go")
    GUISetState(@SW_SHOW, $main)
    While True
    Sleep(10)
    WEnd
    Func _fileOpen()
    $filepath=FileOpenDialog("NC Programm auswählen", @DesktopDir & "\", "Text files (*.txt)", 1 + 2)
    GUICtrlSetData($edit, $filepath)
    EndFunc ;==> _fileOpen
    Func _go()
    Dim $lines
    $pattern = '(T\d+)(?:[^(]*)([^)]*)'
    $data=GUICtrlRead($edit)
    If $data="" Then
    MsgBox(0, "Fehler", "Bitte zuerst Datei auswählen")
    Else
    _FileReadToArray($data, $lines)
    For $i=1 To UBound($lines)-1
    $ret=StringRegExp($lines[$i], $pattern, 3)
    If @error Then ContinueLoop
    ConsoleWrite($ret[0] & ' ' & $ret[1] & ')' & @CRLF)
    Next
    EndIf
    EndFunc ;==> _go
    Func _GUIEvents()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit
    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE
    Case @GUI_CtrlId = $GUI_EVENT_RESTORE
    EndSelect
    EndFunc ;==> _GUIEvents

    [/autoit]
  • [autoit]

    #Include <GUIConstantsEx.au3>
    #Include <Array.au3>
    #Include <File.au3>
    #include <String.au3>
    #NoTrayIcon
    Opt("GUIOnEventMode", 1)
    $main=GUICreate("Werkzeugliste erstellen", 350, 85)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUIEvents")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_GUIEvents")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_GUIEvents")
    $edit=GUICtrlCreateInput("", 5, 5, 340)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $search=GUICtrlCreateButton("NC Programm suchen (.txt) ...", 5, 30, 340, 25)
    GUICtrlSetOnEvent(-1, "_fileOpen")
    $go=GUICtrlCreateButton("Werkzeugliste aus NC Programm erstellen ...", 5, 55, 340, 25)
    GUICtrlSetOnEvent(-1, "_go")
    GUISetState(@SW_SHOW, $main)
    While True
    Sleep(100)
    WEnd
    Func _fileOpen()
    $filepath=FileOpenDialog("NC Programm auswählen", @DesktopDir & "\", "Text files (*.txt)", 1 + 2)
    GUICtrlSetData($edit, $filepath)
    EndFunc
    Func _go()
    Dim $lines
    Dim $matchLines
    Dim $txtfile
    Dim $ergebnis[1]
    $data=GUICtrlRead($edit)
    If $data="" Then
    MsgBox(0, "Fehler", "Bitte zuerst Datei einlesen")
    Else
    If Not _FileReadToArray($data, $txtfile) Then
    Msgbox(0,'Fehler', 'Fehler beim Einlesen der Datei')
    Else
    For $i = 1 To $txtfile[0]
    $split = StringSplit( $txtfile[$i], ' ')
    for $h = 1 To $split[0]
    If StringLeft($split[$h], 1) = 'T' Then
    $zahl = StringRight($split[$h], StringLen($split[$h]) - 1)
    $between = _StringBetween($txtfile[$i], ' (', ')')
    if @error Then
    MsgBox(0, '_StringBetween', @error)
    Else
    _ArrayAdd($ergebnis, $split[$h] & ' (' & $between[0] & ' )')
    $ergebnis[0] = UBound($ergebnis)
    EndIf
    EndIf
    Next
    Next
    _ArrayDisplay($ergebnis)
    EndIf
    EndIf
    EndFunc

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

    Func _GUIEvents()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit
    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE
    Case @GUI_CtrlId = $GUI_EVENT_RESTORE
    EndSelect
    EndFunc ;==> _GUIEvents

    [/autoit]
  • hab gerade entdeckt dass in meiner lösung noch n kleiner fehler ist. bzw die zeile 14 im NC-Quellcode von deinem Post Nr. 20 falsch interpretiert wird.

    diese da:

    Zitat

    N83 (2: T1 2D ANSCHLAGKANTE FRAESEN)

    ansonsten denk ich passt meins. fals der fehler was ausmacht könnte man den noch ausschließen ;)

  • [autoit]


    ;( * egal was ) T<Nummer (auch mehrere Zahlen) ( * egal was ) <Klammer auf> ( * egal was) <Klammer zu>
    Local $aTest[7] = [ _
    'N182 G74 Z-1 L1', _
    'N183 G74 x200 Y-1 L1', _
    'N184 G7', _
    'N83 (2: T1 2D ANSCHLAGKANTE FRAESEN)', _
    'N186 S1800 T3 M6 (HM - Schlichtfraeser D=20,0)', _
    'N187 G39 C3=1', _
    'N188 G74 Z-1 L1']

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

    $pattern = '(T\d+)(.*\(.*\))'

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

    For $i = 0 To UBound($aTest) -1
    $ret = StringRegExp($aTest[$i], $pattern, 3)
    If @error Then ContinueLoop
    ConsoleWrite('Werkzeug: ' & $ret[0] & ' ' & $ret[1] & @CRLF)
    Next

    [/autoit]


    So?

  • Noch ein Versuch von mir ;)

    Spoiler anzeigen
    [autoit]

    #Include <string.au3>
    #Include <Array.au3>
    #Include <File.au3>

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

    $filepath=FileOpenDialog("NC Programm auswählen", @DesktopDir & "\", "Text files (*.txt)", 1 + 2)
    If @error Then Exit

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

    Local $aFile, $FileNew[1]
    _FileReadToArray($filepath, $aFile)

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

    For $i = 1 To $aFile[0]
    If _StringInWildCard($aFile[$i], "*T*(*)") Then
    $Klammer = _StringBetween($aFile[$i], "(", ")")
    $Klammer = $Klammer[0]
    $T = StringTrimLeft($aFile[$i], StringInStr($aFile[$i], "T") - 1)
    $T = StringLeft($T, StringInStr($T, " "))
    _ArrayAdd($FileNew, $T & " (" & $Klammer & ")")
    EndIf
    Next

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

    _FileWriteFromArray("Ergebnis.txt", $FileNew, 1)

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

    Func _StringInWildCard($sTest, $sWildCard)
    ;funkey 14.10.2009
    Local $sPattern = "^" & $sWildCard & "$" ; Muss von Anfang (^)bis Ende ($) passen
    $sPattern = StringReplace($sPattern, ".", "\.")
    $sPattern = StringReplace($sPattern, "(", "\(")
    $sPattern = StringReplace($sPattern, ")", "\)")
    $sPattern = StringReplace($sPattern, "[", "\[")
    $sPattern = StringReplace($sPattern, "]", "\]")
    $sPattern = StringReplace($sPattern, "+", "\+")
    $sPattern = StringReplace($sPattern, "*", ".*")
    $sPattern = StringReplace($sPattern, "?", ".")
    ;~ ConsoleWrite($sPattern & @CR)
    Return StringRegExp($sTest, $sPattern)
    EndFunc

    [/autoit]
  • Danke BugFix so funktioniert es perfekt!

    Danke auch an alle anderen für die Bemühungen und zum Teil Lösungen!

    Gruß Oli

  • auch wenn ichs hier mit den profis zu tun hab würd ich gerne nochmal meine version posten. vllt gefällt sie dir ja

    Spoiler anzeigen
    [autoit]

    #Include <GUIConstantsEx.au3>
    #Include <Array.au3>
    #Include <File.au3>
    #include <String.au3>
    #NoTrayIcon
    Opt("GUIOnEventMode", 1)
    $main=GUICreate("Werkzeugliste erstellen", 350, 85)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUIEvents")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_GUIEvents")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_GUIEvents")
    $edit=GUICtrlCreateInput("", 5, 5, 340)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $search=GUICtrlCreateButton("NC Programm suchen (.txt) ...", 5, 30, 340, 25)
    GUICtrlSetOnEvent(-1, "_fileOpen")
    $go=GUICtrlCreateButton("Werkzeugliste aus NC Programm erstellen ...", 5, 55, 340, 25)
    GUICtrlSetOnEvent(-1, "_go")
    GUISetState(@SW_SHOW, $main)
    While True
    Sleep(100)
    WEnd
    Func _fileOpen()
    $filepath=FileOpenDialog("NC Programm auswählen", @DesktopDir & "\", "Text files (*.txt)", 1 + 2)
    GUICtrlSetData($edit, $filepath)
    EndFunc
    Func _go()
    Dim $lines
    Dim $matchLines
    Dim $txtfile
    Dim $ergebnis[1]
    $data=GUICtrlRead($edit)
    If $data="" Then
    MsgBox(0, "Fehler", "Bitte zuerst Datei einlesen")
    Else
    If Not _FileReadToArray($data, $txtfile) Then
    Msgbox(0,'Fehler', 'Fehler beim Einlesen der Datei')
    Else
    For $i = 1 To $txtfile[0]
    $between = _StringBetween($txtfile[$i], ' (', ')')
    if not @error Then
    $txtfile[$i] = StringTrimRight($txtfile[$i], StringLen($between[0]))
    $anweisungen = StringSplit( $txtfile[$i], ' ')
    for $h = 1 To $anweisungen[0]
    If StringLeft($anweisungen[$h], 1) = 'T' Then
    $zahl = StringRight($anweisungen[$h], StringLen($anweisungen[$h]) - 1)
    _ArrayAdd($ergebnis, $anweisungen[$h] & ' (' & $between[0] & ' )')
    $ergebnis[0] = UBound($ergebnis) - 1
    EndIf
    Next
    EndIf
    Next
    _ArrayDisplay($ergebnis)
    EndIf
    EndIf
    EndFunc

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

    Func _GUIEvents()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit
    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE
    Case @GUI_CtrlId = $GUI_EVENT_RESTORE
    EndSelect
    EndFunc ;==> _GUIEvents

    [/autoit]

    sie bringt jetzt keine falschen ergebnisse mehr.
    leider kenn ich mich mit Stringregex nicht wirklich aus. deshalb is es ohne gelöst
    auch wenn du meine version nicht hernimmst wär ne rückmeldung obs funktioniert klasse

    danke

  • Habs gerade für Dich getestet, leifert die gleichen Ergebnisse *schulterklopf*

    Muss das Forum mal wieder in den höchsten Tönen loben, auch wenn ich schon lange keine Hilfe mehr gebraucht hab! :thumbup:

    Gruß Oli

  • Spoiler anzeigen
    [autoit]


    ;( * egal was ) T<Nummer (auch mehrere Zahlen) ( * egal was ) <Klammer auf> ( * egal was) <Klammer zu>
    #include <Array.au3>
    #include <File.au3>
    #include <string.au3>
    Global $aTest
    _FileReadToArray(@ScriptDir & "\test.txt", $aTest)
    _ArrayDisplay($aTest)
    #cs
    [ _
    'N182 G74 Z-1 L1', _
    'N183 G74 x200 Y-1 L1', _
    'N184 G7', _
    'N83 (2: T1 2D ANSCHLAGKANTE FRAESEN)', _
    'N186 S1800 T3 M6 (HM - Schlichtfraeser D=20,0)', _
    'N187 G39 C3=1', _
    'N188 G74 Z-1 L1']
    #ce

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

    $pattern = '(T\d+)(.*)(\(.*\))' ;nuts
    $pattern2 = '(T\d+)(?:[^(^\r]*)(\([^)]*)' ;bugfix
    $pattern3 = '(T\d+)(?:[^(^\r]*)(\([^)]*\))' ;bugfix seins mit Klammer am Ende

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

    $time = TimerInit()
    For $i = 0 To $aTest[0]
    $ret = StringRegExp($aTest[$i], $pattern3, 3)
    If @error Then ContinueLoop
    ;ConsoleWrite('Werkzeug: ' & $ret[0] & ' ' & $ret[1] & @CRLF)
    Next
    ConsoleWrite("Bugfix mit Klammer :" & $time & @CRLF)

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

    $time1 = TimerInit()
    For $i = 0 To $aTest[0]
    $ret = StringRegExp($aTest[$i], $pattern2, 3)
    If @error Then ContinueLoop
    ;ConsoleWrite('Werkzeug: ' & $ret[0] & ' ' & $ret[1] & ')' & @CRLF)
    Next
    ConsoleWrite("Bugifx :" & $time1 & @CRLF)

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

    $time2 = TimerInit()
    For $i = 0 To $aTest[0]
    $ret = StringRegExp($aTest[$i], $pattern, 3)
    If @error Then ContinueLoop
    ;ConsoleWrite('Werkzeug: ' & $ret[0] & ' ' & $ret[2] & @CRLF)
    Next
    ConsoleWrite("Nuts :" & $time2 & @CRLF)

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

    $time3 = TimerInit()
    Dim $ergebnis[1]
    For $i = 1 To $aTest[0]
    $between = _StringBetween($aTest[$i], ' (', ')')
    If Not @error Then
    $aTest[$i] = StringTrimRight($aTest[$i], StringLen($between[0]))
    $anweisungen = StringSplit($aTest[$i], ' ')
    For $h = 1 To $anweisungen[0]
    If StringLeft($anweisungen[$h], 1) = 'T' Then
    $zahl = StringRight($anweisungen[$h], StringLen($anweisungen[$h]) - 1)
    _ArrayAdd($ergebnis, $anweisungen[$h] & ' (' & $between[0] & ' )')
    $ergebnis[0] = UBound($ergebnis) - 1
    EndIf
    Next
    EndIf
    Next
    ConsoleWrite("Schnitzel :" & $time3 & @CRLF)

    [/autoit]


    So habe mein Pattern auch angepasst und mal einen Speedtest durchgeführt.
    Es zeigt sich, dass RegExp nicht wirklich schnell ist.
    Gewonnen hat bei mir mit hauchdünnem Vorsprung die Lösung von Bugfix.

    Einmal editiert, zuletzt von nuts (23. Oktober 2009 um 14:09)

    • Offizieller Beitrag

    hätte allerdings nicht gedacht dass meine funktion auch nur annähernd so schnell ist wie mit StringRegEx


    Wenn es vom Aufwand vertretbar ist, sind Standard-Stringfunktionen immer zu bevorzugen, da sie deutlich schneller als RegExp sind.
    RegExp hat allerdings den Vorteil, dass man komplexe Prüfmuster sehr variabel abbilden kann. Wenn also ständig wechselnde Sourcen vorhanden sind und flexibel durchsucht werden sollen, ist RegExp die bessere Wahl.

  • Hi, hab gerade den Thread gelesen und obwohl das Prob ja gelöst scheint, schließ ich mich noch mal kurz an.

    So wie ich es sehe, steht doch hinter den T* immer die Bezeichnung "FRAESER" in irgend einem Zusammenhang, oder habe ich den Quelltext nur zu flüchtig gelesen? Wäre es nicht möglich nach dem Vorkommen des Wortes Fraeser im Quelltext zu suchen und dann entsprechend die Strings nach links bzw. nach rechts weiter zu durchsuchen bis links bspw. der Buchstabe T gefolgt von Ziffern erscheint? :?:

    Beschäftige mich im Moment ebenfalls mit RegExps und finde die Möglichkeiten absolut stark. :!: Leider ist die Benutzung dermaßen kryptisch ?( , dass ich vorzugsweise die Stringfunktionen einsetze.
    Gruß

    gnArfL

    • Offizieller Beitrag

    und obwohl das Prob ja gelöst scheint,

    scheint nicht nur so: ;)

    so funktioniert es perfekt!

    Leider ist die Benutzung dermaßen kryptisch ?( , dass ich vorzugsweise die Stringfunktionen einsetze.

    Bei RegExp-Lösungen gibt es niemals DIE Lösung. Du hast immer mehrere Varianten um an das Ziel zu kommen. Einer prüft gern auf Match, ein anderer lieber auf Ausschluß und beide kommen ans Ziel. So kryptisch es im ersten Moment auch scheint, hier hilft nur üben. Geht ganz gut beim Daten selektieren aus Web-Source. Dort abgebildete Tabellen unterliegen einem Muster, das kannst du erkennen und darauf dein Pattern ausrichten. Versuche es weiter, notfalls sind wir ja auch noch da. :)