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
Problem mit StringBetween
-
- [ gelöst ]
-
shadow667 -
8. Mai 2011 um 15:01 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Zeig mal deinen Versuch, dann kann man dir auch sagen was falsch ist.
-
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
-
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)
EndIf -
- Offizieller Beitrag
Funzt 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.
-
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 -
- Offizieller Beitrag
Dann liegt es am Dateiformat.
Hab dein Beispiel einfach mit Scite als test.txt abgespeichert und es ging.
Ggf. mal eine Testdatei anhängen.Edit dein Fehler bezieht sich auf
$Neu = FileOpen($Pfad&"\"&$Dat[0]&".nc", 2)Hat es überhaupt was mit deinem _StringBetween zu tun?
Liegt es vielleicht bereits an $String? -
Hier 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
Spoiler anzeigen
[autoit]#Region - Timestamp
[/autoit]
;2011-05-08 19:14:32
#EndRegion
#include<array.au3>
$sPath = ""
$sFileName = ""
$hFile = FileOpen($sPath)
$sFile = FileRead($hFile)
$aResult = StringRegExp($sFile, '\:(\d+)\((.*)\)|\:(\d+)', 1, 1)
If IsArray($aResult)Then
For $element In $aResult
$sFileName &= $element
Next
ConsoleWrite($sFileName & @CRLF)
EndIf -
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!
-
- Offizieller Beitrag
Ich denke mal das liegt nihct nur an der Dateienendung.
Schau dir mal die Originaldatei in Scite an und wähle unter Menü View EndofLine aus.
Wird jede Zeile auch per @cr oder @cr@lf abgeschlossen? Wenn die Zeile mit @lf abgeschlossen wird, kann nix gefunden werden. -
Danke für den Tip noch!
Es wird allerdings auch schon meine Original-Datei per @CR@LF beendet, jetz funktioniert's aber!
Gruß