17 antworten innerhalb von knapp 2 stunden.
des sagt schon alles dazu wie gut das problem beschrieben wurde
Oder wie gut es verstanden wird
17 antworten innerhalb von knapp 2 stunden.
des sagt schon alles dazu wie gut das problem beschrieben wurde
Oder wie gut es verstanden wird
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']
$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
Alles anzeigenHier eine Lösungsvariante:
[autoit]Local $aTest[7] = [ _
[/autoit] [autoit][/autoit] [autoit]
'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']$pattern = '(T\d+)(?:[^(]*)([^)]*)'
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To UBound($aTest) -1
[/autoit]
$ret = StringRegExp($aTest[$i], $pattern, 3)
If @error Then ContinueLoop
ConsoleWrite('Werkzeug: ' & $ret[0] & ' ' & $ret[1] & ')' & @CRLF)
Next
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
#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
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
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:
ZitatN83 (2: T1 2D ANSCHLAGKANTE FRAESEN)
ansonsten denk ich passt meins. fals der fehler was ausmacht könnte man den noch ausschließen
* 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']
$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
So?
Noch ein Versuch von mir
#Include <string.au3>
#Include <Array.au3>
#Include <File.au3>
$filepath=FileOpenDialog("NC Programm auswählen", @DesktopDir & "\", "Text files (*.txt)", 1 + 2)
If @error Then Exit
Local $aFile, $FileNew[1]
_FileReadToArray($filepath, $aFile)
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
_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
Ändere mein Pattern auf:
[autoit]$pattern = '(T\d+)(?:[^(^\r]*)(\([^)]*)'
[/autoit]
Dann sollte es passen.
Edit: Hab noch eine Korrektur vorgenoommen, nun passt es aber.
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
#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
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
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!
Gruß Oli
ZitatHabs gerade für Dich getestet, leifert die gleichen Ergebnisse *schulterklopf*
jippie dankeschön
* 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
$pattern = '(T\d+)(.*)(\(.*\))' ;nuts
$pattern2 = '(T\d+)(?:[^(^\r]*)(\([^)]*)' ;bugfix
$pattern3 = '(T\d+)(?:[^(^\r]*)(\([^)]*\))' ;bugfix seins mit Klammer am Ende
$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)
$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)
$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)
$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)
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.
Gewonnen hat bei mir mit haudünnem Vorsprung die Lösung von Bugfix.
Der hauchdünne Vorsprung entsteht dadurch, dass ich anweise, die 2.te Backreferenz nicht zu berücksichtigen (?:)
Möglicherweise.
Auf jeden Fall ist Schnitzel auch gut dabei.
Das lässt sich aber bestimmt noch optimieren.
meins?
mit sicherheit
hätte allerdings nicht gedacht dass meine funktion auch nur annähernd so schnell ist wie mit StringRegEx
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
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.