Problem mit StringBetween

  • 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

    UNPLEASANT SPOILER

    You just lost the game!

    Einmal editiert, zuletzt von shadow667 (8. Mai 2011 um 20:01)

  • 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.
    Bislang habe ich den Dateinamen nur aus dem Wert in der Klammer erstellt, etwa so:

    [autoit]


    $Text = FileRead($File) ; $File aus einer FileOpen()
    $String = String($Text)

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

    $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.
    Mein Lösungsansatz war nun also, die Programm-Nummer mit in den Dateinamen zu übernehmen, also via

    [autoit]

    _Stringbetween($String, ":", Chr(13))

    [/autoit]

    Dieses funktioniert nun leider nicht

    MfG

    UNPLEASANT SPOILER

    You just lost the game!

  • Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ;2011-05-08 18:19:04
    #EndRegion
    #include<array.au3>
    $sPath = ""
    $hFile = FileOpen($sPath)
    $sFile = FileRead($hFile)

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

    $aResult = StringRegExp($sFile, '\:(\d+)\((.*)\)', 1, 1)
    If IsArray($aResult) And UBound($aResult) >= 2 Then
    $sFileName = $aResult[0] & "_" & $aResult[1]
    ConsoleWrite($sFileName & @CRLF)
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Funzt mit _StringBetween auch.

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2011-05-08 18:22:55
    #EndRegion

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

    #include <array.au3>
    #include <String.au3>
    $String = FileRead("C:\Program Files (x86)\AutoIt3\SciTE\tools\test.txt") ; $File aus einer FileOpen()

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

    $DateiName = _StringBetween($String, "(", ")")
    _ArrayDisplay($DateiName)
    $Dateiname2= _Stringbetween($String, ":", Chr(13))
    _ArrayDisplay($DateiName2)

    [/autoit]

    Ich denke mal das Problem liegt eher daran, das der TE nicht beachtet hat, das die Rückgabe von _StringBetween ein Array ist.

  • 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


    Die Array-Geschichte hat der TE sehr wohl beachtet! :D

    Allerdings passiert folgendes:
    Bei

    [autoit]


    $Start = ":"
    $End = Chr(13)

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

    $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

    UNPLEASANT SPOILER

    You just lost the game!

    Einmal editiert, zuletzt von shadow667 (8. Mai 2011 um 18:56)

    • 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
    ;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

    [/autoit]
  • 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!

    UNPLEASANT SPOILER

    You just lost the game!

    • 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ß

    UNPLEASANT SPOILER

    You just lost the game!