Das war ja auch nur ein Beispiel-NC-Programm... es kann zwischendurch vorkommen, daß die ein oder andere Zeile kein "N" am Anfang hat
Beiträge von shadow667
-
-
Alles anzeigen
Hier noch die Variante für RegExp, damit es nicht zu haarsträubend wird, habe ich den Klammerausdruck zwischengesichert und nach Leerzeicheneinfügen wieder eingesetzt.
Ich gehe mal davon aus, dass immer nur ein Klammerausdruck enthalten ist, anderenfalls müßte man das noch abändern.Spoiler anzeigen
[autoit]Local $s = _
[/autoit] [autoit][/autoit] [autoit]
"N5M6T1(BOHRER D10)" & @CRLF & _
"N10G0G54X10Y30S500M3" & @CRLF & _
"N15G0Z30" & @CRLF & _
"N20G81R2Z-15F500" & @CRLF & _
"N20G0G80Z300"$sBraces = StringRegExp($s, '\(.+\)', 1)
[/autoit]
$sOut = StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($s, '\(.+\)', '(1)'), '([A-MO-Z(])', ' $1'), '\(1\)', $sBraces[0])
ConsoleWrite($sOut & @CRLF)Um's mal salopp zu sagen: Geilomatik

Klappt super, auch wenn ich den Syntax net versteh!
Was müsste geändert werden, wenn ich am Zeilenanfang kein Leerzeichen haben möchte?
Edit:
Trotzdem noch 'n Fehler gefunden: Wenn ein Programm nicht nur einen Kommentar enthält, werden alle anderen Kommentare durch diesen ersetzt

Edit2: Hab zu spät gelesen, daß du das Klammer-Thema schon angeschnitten hast.... Ja, es kommen unterschiedliche Kommentare vor
-
Ah ja, müsste funktioneren, wenn du das [^)\r\n] in ein [^)\r\n\d] machst!
https://autoit.de/index.php?page=Thread&threadID=19071 <-- RegExp TutorialLeider nein! Es werden immernoch Zeichen durch Leerzeichen ersetzt
Danke für den Link zum Tutorial
-
Mit deiner Technik würde vor jedem Zeichen außer den 2 ein Leerzeichen kommen, versuch lieber hinter Buchstabe-Zahl-nichtklammerzuundnichtzeilenende ein Leerzeichen zu machen. Wenn du es nicht schaffst guck in den Spoiler

Spoiler anzeigen
[autoit]$new=StringRegExpReplace($old,"(?i)(?s)([A-Z]\d+?)[^)\r\n]","$1 ")
[/autoit]Ich fress den Syntax von StringRegExpReplace net... allerdings, wenn ich deine Zeile in mein Script einfüge, werden die Leerzeichen zwar eingefügt, aber teilweise andere Zeichen dadurch ersetzt... warum auch immer

-
Ich habe ein "kleines" Problem mit StringRegExpReplace
Bevor ich nun zu meinem Problem komme, kurz zur Erläuterung:
Ich bin Programmierer für NC-Werkzeugmaschinen und schreibe aktuell an einem kleinen Editor.
Wenn ich ein NC-Programm aus der Maschine sichere, hat die Steuerung aus Platzgründen alle Leerzeichen entfernt.Hier mal kurz der Aufbau eines NC-Programmes:
Original:CodeN5 M6 T1 (BOHRER D10) N10 G0 G54 X10 Y30 S500 M3 N15 G0 Z30 N20 G81 R2 Z-15 F500 N20 G0 G80 Z300Rückgabe aus Maschine:
Ich hoffe, ihr seht mein Problem. Ich möchte quasi, falls möglich, per StringRegExpReplace() vor allen Buchstaben ausser "N" und vor "(" ein Leerzeichen einfügen, wobei der Text zwischen den Klammern ausgespart werden soll, da dies einen von der Maschine nicht gelesenen Kommentar darstellt, der auch nicht verändert wird.
Ich bedanke mich schonmal für die Hilfe von euch Profis
Gruß Shadow
-
Alles anzeigen
Hallo JaySini,
hier ein kleines Beispiel:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <File.au3>
;
Global $sIniFile$idGUI = GUICreate("Ini-Verwaltung", 300, 160)
[/autoit] [autoit][/autoit] [autoit]
$idList = GUICtrlCreateList("", 10, 10, 180, 80)
$aInis = _FileListToArray(@ScriptDir, "*.ini", 1)
If IsArray($aInis) Then
For $i = 1 To $aInis[0]
GUICtrlSetData($idList, $aInis[$i])
Next
EndIf
$idLabel = GUICtrlCreateLabel("", 10, 100, 290, 22)
$idBtnMsgBox = GUICtrlCreateButton("MsgBox", 10, 130, 290, 22)
GUICtrlSetState($idBtnMsgBox,$GUI_DISABLE)
GUISetState()While 1
[/autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $idList
$sIniFile = @ScriptDir & "\Daten\" & GUICtrlRead($idList)
GUICtrlSetData($idLabel, $sIniFile)
GUICtrlSetState($idBtnMsgBox,$GUI_ENABLE)
Case $idBtnMsgBox
MsgBox(0,"ausgewählt:",$sIniFile)
EndSwitch
WEndEdit: shadow667 hat es ja zwischenzeitlich gelöst, da war ich wohl zu langsam
mfg autoBert
Die Sache, daß direkt beim klicken der Liste eine Aktion ausgeführt wird gefällt mir! Kannte ich so bislang noch nicht...
Aber man lernt ja nie aus
-
Bin ja auch doof... manchmal sollte man die angebotenen Scripte auch lesen
Ich hatte die ganze zeit ein ListView im Kopf
Bei GUICtrlCreateList reicht beim Auslesen natürlich ein GUICtrlRead($hListBox)Und so funktioniert's dann auch:
[autoit]#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
[/autoit][autoit][/autoit][autoit]
#include <GUIListBox.au3>
#include <GuiConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>Opt('MustDeclareVars', 1)
[/autoit][autoit][/autoit][autoit]$Debug_LB = False ; Prüft den Klassennamen (ClassName), der an die ListBox-Funktion übergeben wird. Setze dies versuchsweise auf True und verwende dann ein Handle zu einem anderen Control, um die Funktionsweise zu verstehen.
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global $hListBox; Erstellt eine GUI
[/autoit][autoit][/autoit][autoit]
GUICreate("ListBox: Verzeichnis einlesen", 400, 400)
$hListBox = GUICtrlCreateList("", 2, 2, 200, 296)
Global $Button1 = GUICtrlCreateButton("test", 10, 320, 320, 20, $WS_GROUP)
GUISetState(); Fügt Dateien hinzu
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GUICtrlListBox_BeginUpdate($hListBox)
_GUICtrlListBox_ResetContent($hListBox)
_GUICtrlListBox_InitStorage($hListBox, 100, 4096)
_GUICtrlListBox_Dir($hListBox, "*.ini")
_GUICtrlListBox_AddFile($hListBox, @Scriptdir & "*.ini")
_GUICtrlListBox_EndUpdate($hListBox); Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
[/autoit][autoit][/autoit][autoit]While 1
[/autoit][autoit][/autoit][autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Button1()EndSwitch
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
WEndFunc Button1()
[/autoit][autoit][/autoit][autoit]
MsgBox(0,"Ausgewählter Eintrag", GUICtrlRead($hListBox))EndFunc
[/autoit] -
[autoit]Alles anzeigen
[/autoit] [autoit][/autoit] [autoit]
; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Button1()EndSwitch
[/autoit]
WEndSo startet er ohne fehler, jedoch it button ohne funktion
Ja Ne is klar

Schließlicht bleibt dein Script ja in deiner Do...Until-Schleife hängen, noch bevor es in die While-Schleife kommt
-
Siehe Edit, ein Post weiter oben

-
Änder mal
[autoit]$Button1 = GUICtrlCreateButton("test", 10, 320, 110, 20, $WS_GROUP)
[/autoit]
[autoit]
nachGlobal $Button1 = GUICtrlCreateButton("test", 10, 320, 110, 20, $WS_GROUP)
[/autoit]Edit: Für $WS_GROUP musst du noch
[autoit]#include <WindowsConstants.au3>
[/autoit]
mit einfügenUnd setz doch mal $hListBox statt Local Global
-
Probiers mal statt mit
[autoit]If WinExists($g_szVersion) Then Exit
[/autoit]mit
[autoit]
[/autoit]
$Win = WinList($g_szVersion)
If $Win[0][0] >1 Then Exit ; -
[quote='JaySini','index.php?page=Thread&postID=221885#post221885']
[autoit]Func Button1()
[/autoit][autoit][/autoit][autoit]
MsgBox(0, GUICtrlRead($hListBox), "Keine Ordner gefunden.")EndFunc
[/autoit]Damit erstellst du dir 'ne MsgBox, welche in der Titelleiste die Nummer deiner ListView-Auswahl anzeigt und den Text "Keine Ordner gefunden" im Fenster.
[autoit]
Wenn du im Fenster deinen markierten ListView-Eintrag haben willst, dann so:MsgBox(0,"Ausgewählter Eintrag", GUICtrlRead(GUICtrlRead($hListBox)))
[/autoit]Achte auf das doppelte GUICtrlRead
-
Probier's mal so:
[autoit]$Var1 = GUICtrlRead(GUICtrlRead($hListBox))
[/autoit] -
Du kannst deine Schleife etwas erweitern/ändern. Ich persönlich mache das mit den Buttons immer so:
[autoit]While 1
[/autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_DeineFunktion()
Case $Button2
_DeineAndereFunktion()
EndSwitch
WEndDamit kannst du in der Schleife alle Button-Eingaben in der GUI abfangen
-
Danke für den Tip noch!
Es wird allerdings auch schon meine Original-Datei per @CR@LF beendet, jetz funktioniert's aber!
Gruß
-
Scheinbar lag's tatsächlich an der Datei...
Unsere NC-Programme haben eben die Endung .nc
Nun habe ich eine Sicherung (vorher .nc) als .txt abgespeichert und mein Script nochmal laufen lassen - siehe da, es lief...Wenn du mir jetz noch erklären kannst, warum das so ist wäre ich sehr dankbar!
-
Alles anzeigen
Spoiler anzeigen
[autoit]#Region - Timestamp
[/autoit] [autoit][/autoit] [autoit]
;2011-05-08 18:19:04
#EndRegion
#include<array.au3>
$sPath = ""
$hFile = FileOpen($sPath)
$sFile = FileRead($hFile)$aResult = StringRegExp($sFile, '\:(\d+)\((.*)\)', 1, 1)
[/autoit]
If IsArray($aResult) And UBound($aResult) >= 2 Then
$sFileName = $aResult[0] & "_" & $aResult[1]
ConsoleWrite($sFileName & @CRLF)
EndIfHier wird's wahrscheinlich 'n Problem geben, wenn ein NC-Programm nach der Programmnummer (:0123) keinen Kommentar hat, was zwar selten aber doch von Zeit zu Zeit vorkommt
Alles anzeigenFunzt mit _StringBetween auch.
Spoiler anzeigen
[autoit]#Region - Timestamp
[/autoit] [autoit][/autoit] [autoit]
; 2011-05-08 18:22:55
#EndRegion#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <String.au3>
$String = FileRead("C:\Program Files (x86)\AutoIt3\SciTE\tools\test.txt") ; $File aus einer FileOpen()$DateiName = _StringBetween($String, "(", ")")
[/autoit]
_ArrayDisplay($DateiName)
$Dateiname2= _Stringbetween($String, ":", Chr(13))
_ArrayDisplay($DateiName2)Ich denke mal das Problem liegt eher daran, das der TE nicht beachtet hat, das die Rückgabe von _StringBetween ein Array ist.
Die Array-Geschichte hat der TE sehr wohl beachtet!

Allerdings passiert folgendes:
[autoit]
Bei
[/autoit][autoit][/autoit][autoit]
$Start = ":"
$End = Chr(13)$Dat = _StringBetween($String, $Start, $End)
[/autoit]G:\Datensicherungs-Splitter.au3 (89) : ==> Subscript used with non-Array variable.:
$Neu = FileOpen($Pfad&"\"&$Dat[0]&".nc", 2)
$Neu = FileOpen($Pfad&"\"&$Dat^ ERROR -
Ok, dann muß ich aber etwas weiter ausholen:
Was ich machen möchte ist folgendes:
Wenn ich auf Arbeit aus meiner CNC-Fräsmaschine eine Datensicherung (NC-Programme) ausspiele, werden alle Programme nacheinander in einer Textdatei abgelegt
Nun habe ich mit AutoIt ein Script erstellt, welches diese Datei als String ausliest und als einzelne Text-Dateien abspeichert.So in etwa ist ein NC-Programm aufgebaut:
Spoiler anzeigen
%
:0123(Kommentar)
N5 Programmcode
N10 Programmcode
N15 Programmcode
N20 Programmcode[
N25 M99 (Programmende)
%Mein Problem besteht nun in der "Erstellung" des Dateinamens.
[autoit]
Bislang habe ich den Dateinamen nur aus dem Wert in der Klammer erstellt, etwa so:
[/autoit][autoit][/autoit][autoit]
$Text = FileRead($File) ; $File aus einer FileOpen()
$String = String($Text)$DateiName = _StringBetween($String, "(", ")")
[/autoit]Nun tauchte aber in der Praxis das Problem auf, daß, wenn mehrere NC-Programme den gleichen Kommentar hatten, gleichnamige immer überschrieben werden.
[autoit]
Mein Lösungsansatz war nun also, die Programm-Nummer mit in den Dateinamen zu übernehmen, also via_Stringbetween($String, ":", Chr(13))
[/autoit]Dieses funktioniert nun leider nicht
MfG
-
Guten Tag!
Ich möchte aus einem String mittels _StringBetween einen Teilstring welcher sich zwischen einem Doppelpunkt ":" und dem nächsten Zeilenumbruch befindet auslesen, nur leider klappt das nicht und ich bekomme immer die Meldung, meine Variable wäre kein Array, was aber bei korrekter Funktion von _StringBetween sein sollte.
Meine Frage nun: wie muss der Syntax der Zeile richtig lauten?
MfG