Problem mit _stringbetween

  • Hallo Leute.

    Folgendes Problem:

    Ich habe eine .PCB-Datei, die wie folgt aufgebaut ist:

    Spoiler anzeigen


    S!LINE!257!1740 14 0!683.8!1684.3!565.7!1566.2!0.0!!!!!PLACE_BOUND_TOP!PRNC2975!C700!
    S!TEXT!260!1744 1!746.8!1656.8!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!+!!!ASSEMBLY_TOP!PRNC2975!C700!
    S!TEXT!260!1745 1!794.0!1733.5!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!+!!!SILKSCREEN_TOP!PRNC2975!C700!
    S!TEXT!260!1746 1!-32.8!2879.7!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!"This keep out area is possible!!!ASSEMBLY_TOP!PRNC2975!C700!
    S!TEXT!260!1747 1!-95.7!2879.7!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!to remove, when the elco is not!!!ASSEMBLY_TOP!PRNC2975!C700!
    S!TEXT!260!1748 1!-158.7!2879.7!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!sealed between component and!!!ASSEMBLY_TOP!PRNC2975!C700!
    S!TEXT!260!1749 1!-221.7!2879.7!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!PCB by gluing, coating, agglutination!!!ASSEMBLY_TOP!PRNC2975!C700!
    S!TEXT!260!1750 1!-284.7!2879.7!270.000!NO!LEFT!20 0 50.0 38.2 0.000 13.0 63.0 0.0!or an other sealing method.!!!ASSEMBLY_TOP!PRNC2975!C700!

    Das Problem ist nun, wenn ich diese Datei mittels meinem Script einlese, dann werden einige Strings einfach verschluckt. Ich habe schon die Vermutung, dass es am ' " '-Zeichen liegt. Kann das sein, dass _stringbetween damit Probleme hat?

    die Datei habe ich angehägt.

    Hier ist mein Script, das Probleme macht. Danke schonmal im Voraus für eure Tipps.

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    #Include <File.au3>
    Global $Path
    Dim $aDest
    Dim $aDatei
    _Laden()

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

    Func _Laden()
    $Path = FileOpenDialog("Bitte PCB-Datei wählen.", @DesktopDir & "\", "PCB-File (*.pcb)", 1 + 4 )
    If @error = 1 Then MsgBox(0,"","Keine Datei ausgewählt.")
    If @error = 2 Then MsgBox(0,"","Falscher Dateifilter")
    _FileReadToArray($Path,$aDatei)

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

    For $i =1 To $aDatei[0]

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

    Local $aArray1 = _StringBetween($aDatei[$i], '!', '!')

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

    _ArrayDisplay($aArray1, 'Default Search')
    Next

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

    EndFunc ;==>_Laden

    [/autoit]

    Ach ja, die TXT muss in PCB umbenannt werden.

    Gruß.

  • Also bei der Datei im Anhang funktioniert dein Script problemlos. Alle Zeilen werden richtig ausgegeben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • chip: ich muss dir leider wiedersprechen: ich habe mit folgendem Skript:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    #include <File.au3>
    Global $Path
    $aDatei = _Laden()
    _ArrayDisplay($aDatei)

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

    Func _Laden()
    Local $aTmp, $aSource, $aResult
    $Path = FileOpenDialog("Bitte PCB-Datei wählen.", @DesktopDir & "\", "PCB-File (*.pcb)", 1 + 4)
    If @error = 1 Then MsgBox(0, "", "Keine Datei ausgewählt.")
    If @error = 2 Then MsgBox(0, "", "Falscher Dateifilter")
    _FileReadToArray($Path, $aSource)
    Dim $aResult[$aSource[0]][9]
    For $i = 1 To $aSource[0]
    $aTmp = _StringBetween($aSource[$i], '!', '!')
    For $j = 0 To UBound($aTmp) - 1
    $aResult[$i][$j] = $aTmp[$j]
    Next
    Next
    $aResult[0][0] = $aSource[0]
    Return $aResult
    EndFunc ;==>_Laden

    [/autoit]

    ein 2D-Array erstellt:

    das Ergebnis ist defintiv nicht korrekt

    hexpirator: Mit StringSplit anstelle von _StringBetween:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    #include <File.au3>
    Global $Path
    $aDatei = _Laden()
    _ArrayDisplay($aDatei)

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

    Func _Laden()
    Local $aTmp, $aSource, $aResult
    $Path = FileOpenDialog("Bitte PCB-Datei wählen.", @DesktopDir & "\", "PCB-File (*.pcb)", 1 + 4)
    If @error = 1 Then MsgBox(0, "", "Keine Datei ausgewählt.")
    If @error = 2 Then MsgBox(0, "", "Falscher Dateifilter")
    _FileReadToArray($Path, $aSource)
    Dim $aResult[$aSource[0]+1][19]
    For $i = 1 To $aSource[0]
    $aTmp = StringSplit($aSource[$i], '!',2)
    For $j = 0 To UBound($aTmp) - 1
    $aResult[$i][$j] = $aTmp[$j]
    Next
    Next
    $aResult[0][0] = $aSource[0]
    Return $aResult
    EndFunc ;==>_Laden

    [/autoit]

    kommt das korrekte Ergebnis heraus (evtl. muss das eintragen der 1. Spalte und der letzten Zeile noch verhindert werden):

    frohes neues Jahr

    autoBert

  • Hallo Auto Bert.

    Vielen Dank für die Antwort. Das funktioniert ja schon mal super. Allerdings ist das Originalfile über 40000 Zeilen lang. Da kommt das Script nicht klar.

    Was ich nun machen müsste ist, die Spalte, wo ' "This keep out area is possible' vorkommt ab einer Zeichenlänge von sagen wir mal 15 Zeichen zu löschen.
    Im Grunde genommen geht es mir nur um diese Spalte.
    Der Hintergrund ist, dass wenn in dieser Spalte zu viele Zeichen sind, dann stürzt mein Programm zur Darstellung der Positionen ab.

    Hast du oder sonst jeman da vielleicht eine Idee?

    Schönen Gruß und frohes neues Jahr.

    2 Mal editiert, zuletzt von hexpirator (5. Januar 2012 um 08:14)

  • autoBert doch ist vollkommen richtig, was _StringBetween ausgibt.

    Da _StringBetween den String Stück für Stück zerlegt.

    Beispiel :

    Startstring: S!1654.0!879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!
    erster suche ergibt 1654.0
    Reststring: 879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!
    zweite suche ergibt: VIA05_NEW
    Reststring: UNNAMED_1_ELKO_I547_A!!
    dritte sucher Ergibt:


    Hier noch Scriptvorschlag von mir zum kürzen. Getestet mit einer pcb mit 50k Zeilen:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    #include <File.au3>
    Global $Path

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

    _Laden()

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

    Func _Laden()
    Local $aTmp, $aSource, $aResult
    $Path = FileOpenDialog("Bitte PCB-Datei wählen.", @DesktopDir & "\", "PCB-File (*.pcb)", 1 + 4)
    If @error = 1 Then MsgBox(0, "", "Keine Datei ausgewählt.")
    If @error = 2 Then MsgBox(0, "", "Falscher Dateifilter")
    _FileReadToArray($Path, $aSource)
    Dim $aResult[$aSource[0] + 1][19]

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

    $file = FileOpen($Path, 2)
    For $i = 1 To $aSource[0]
    ToolTip($i)
    $aTmp = StringSplit($aSource[$i], '!', 2)
    If UBound($aTmp) > 10 Then
    $zeichen = StringLen($aTmp[10])
    If $zeichen > 15 Then
    $aTmp[10] = StringTrimRight($aTmp[10], $zeichen - 15)
    EndIf
    EndIf
    $final = _ArrayToString($aTmp, "!")
    FileWriteLine($file, $final)
    Next
    FileClose($file)
    EndFunc ;==>_Laden

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

    Oder alternative den Wert ganz löschen:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>
    #include <File.au3>
    Global $Path

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

    _Laden()

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

    Func _Laden()
    Local $aTmp, $aSource, $aResult
    $Path = FileOpenDialog("Bitte PCB-Datei wählen.", @DesktopDir & "\", "PCB-File (*.pcb)", 1 + 4)
    If @error = 1 Then MsgBox(0, "", "Keine Datei ausgewählt.")
    If @error = 2 Then MsgBox(0, "", "Falscher Dateifilter")
    _FileReadToArray($Path, $aSource)
    Dim $aResult[$aSource[0] + 1][19]

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

    $file = FileOpen($Path, 2)
    For $i = 1 To $aSource[0]
    ToolTip($i)
    $aTmp = StringSplit($aSource[$i], '!', 2)
    If UBound($aTmp) > 10 Then
    $zeichen = StringLen($aTmp[10])
    If $zeichen > 15 Then
    $aTmp[10] = ""
    EndIf
    EndIf
    $final = _ArrayToString($aTmp, "!")
    FileWriteLine($file, $final)
    Next
    FileClose($file)
    EndFunc ;==>_Laden

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    5 Mal editiert, zuletzt von chip (5. Januar 2012 um 08:53)

  • autoBert doch ist vollkommen richtig, was _StringBetween ausgibt.

    Da _StringBetween den String Stück für Stück zerlegt.

    Beispiel :

    Startstring: S!1654.0!879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!
    erster suche ergibt 1654.0
    Reststring: 879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!
    zweite suche ergibt: VIA05_NEW
    Reststring: UNNAMED_1_ELKO_I547_A!!
    dritte sucher Ergibt:

    schön zurecht gereimt, aber der 1. Reststring müsste korrekt gleich !879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!! sein da ja nur um den String der dazwischen liegt (und alles davor gekürzt werde sollte. Imho ist dies ein echter Bug ist der nur auftritt wenn Start- und Stopstring identisch sind. Da ich in einem solche Fall aber eh StringSplit benutze kann ich damit leben,

    frohes neues Jahr autoBert

  • Tja da muss ich dich leider enttäuschen, das ist weder ein Bug noch hat es etwas mit gleichen start und endwert zu tun:

    [autoit]

    #include <Array.au3>
    #include <String.au3>
    $string = "S!1654.0#879.5!VIA05_NEW#UNNAMED_1_ELKO_I547_A!#"
    $array = _StringBetween($string,"!","#")
    _ArrayDisplay($array)

    [/autoit]

    _StringBetween entfernt schlicht auch End und Starttags aus dem Reststring wie bereits in meinem letzten Post beschrieben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Tja da muss ich dich leider enttäuschen, das ist weder ein Bug noch hat es etwas mit gleichen start und endwert zu tun:

    [autoit]

    #include <Array.au3>
    #include <String.au3>
    $string = "S!1654.0#879.5!VIA05_NEW#UNNAMED_1_ELKO_I547_A!#"
    $array = _StringBetween($string,"!","#")
    _ArrayDisplay($array)

    [/autoit]

    wieso absolut korrektes Ergebnis, alle Werte die sich zwischen einem "!" (also direkt davor) und "#" (also direkt danach) befinden wurden gefunden:

    Code
    [0]|1654.0
    [1]|VIA05_NEW
    [2]|


    bei identischen Zeichen wird jedoch jeder 2. zu findende Streing unterschlagen. Oder liegt in deinem Beispiel:

    Zitat

    Startstring: S!1654.0!879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!

    VIA05_NEW nicht zwischen einem ! und einem nachfolgendem ! :?:

    Wenn die Funktion anscheind so arbeitet wie du beschreibst sollte dies auch aus der Hilfe ersichtlich sein,

    frohes neues Jahr

    autoBert

  • So mein letzter Post da du es einfach nicht verstehen willst oder es nicht kannst:

    [autoit]

    #include <Array.au3>
    #include <String.au3>
    $string = "S!1654.0#879.5!VIA05_NEW#UNNAMED_1_ELKO_I547_A!#"
    $array = _StringBetween($string,"!","#")
    _ArrayDisplay($array)

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

    $string = "S!1654.0!879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!"
    $array = _StringBetween($string,"!","!")
    _ArrayDisplay($array)

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ich kann deinen Versuch unbedingt Recht haben zu wollen wirklich nicht verstehen. Sicher sind die Ergebnisse der beiden Arraydisplay jetzt gleich. Im Fall von

    [autoit]

    _StringBetween($string,"!","#")

    [/autoit]

    wird ja auch das korrekte Ergebnis angezeigt (wie nach Hilfebeschreibung zu erwarten). Im zweiten Fall aber nicht da sich wie du vielleicht hierdurch:

    Zitat

    "S!1654.0!879.5!VIA05_NEW!UNNAMED_1_ELKO_I547_A!!"

    besser erkennen kannst auch 879.5 zwischen einem Ausrufezeichen davor und einem Ausrufzeichen danach befindet stimmt das Ergebnis nicht. Auch ist nach der Hilfebeschreibung:

    Zitat

    _StringBetween

    Gibt einen Teilstring zwischen einem angegebenen Start-String und einem Stopp-String zurück

    nicht mit diesem Ergebnis zu rechnen. Dieser Fall tritt aber nur bei identischem Start- Stopstring auf. Da ich wie bereits geschrieben aber damit leben kann da ich in einem solchen Falle immer StringSplit verwende könnte es mir egal sein, man sollte es aber in der Hilfe unter Bemerkungen hinzufügen.

    frohes neues Jahr

    autoBert

    2 Mal editiert, zuletzt von autoBert (5. Januar 2012 um 14:03)