String suchen und zerlegen

  • Hallo
    ich habe folgende Frage
    ich habe mir eine Listview erstellt in dem ich in eimen Feld eine SPS adresse eingeben z.b DB5.DBX6.0

    Jetzt musste ich für die weitere Verarbeitung die 5 in $DB, die 6 in $Byte und die 0 in $ Bit schreiben.
    Wie kann ich aus einem String diese werte ermitteln.?

    Wobei sich in einem weitern schritt die Struktur verändern kann.
    z.b DB5.DBW1

    Gibt es eine Funktion wo ich nach DB. suche und den die nächsten Zahlenwerte in $DB speichere ?

  • Moinidoini Andreas (alias emilio20).

    Soweit erst einmal ohne das sich die Strucktur verändert:

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    #include <Array.au3>

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

    ; Beispiel-1
    ; die 5 in $DB, die 6 in $Byte und die 0 in $Bit packen.
    $text = "DB5.DBX6.0"
    Global $aArray1 =_StringBetween($text,"DB", ".DBX") ; Wert liegt zwischen "DB" und ".DBX"
    Global $aArray2 =_StringBetween($text,".DBX", ".") ; Wert liegt zwischen ".DBX" und "."
    Global $aArray3 =_StringBetween($text, "6.", "") ; Wert liegt zwischen "6." und ""

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

    ; Ausgabe in MsgBox
    ; Bei diesem Array werden die Werte in das $aArray?[0] geschrieben, wobei das Fragezeichen durch die
    ; jeweilige Arraynummer (in diesem Fall die Zahlen 1,2, oder 3) ersetzt werden
    MsgBox(0,"DB5.DBX6.0", "$DB=" & $aArray1[0] & " $Byte=" & $aArray2[0] & " $Bit=" & $aArray3[0])

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

    ; Beispiel-2
    ; die 5 in $DB, das W in $Byte und die 1 in $Bit packen.
    $text = "DB5.DBW1"
    Global $aArray4 =_StringBetween($text,"DB", ".DB") ; Wert liegt zwischen "DB" und ".DBX"
    Global $aArray5 =_StringBetween($text,".DB", "1") ; Wert liegt zwischen ".DBX" und "."
    Global $aArray6 =_StringBetween($text, "W", "") ; Wert liegt zwischen "6." und ""

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

    ; Ausgabe in MsgBox
    ; Bei diesem Array werden die Werte in das $aArray?[0] geschrieben, wobei das Fragezeichen durch die
    ; jeweilige Arraynummer (in diesem Fall die Zahlen 1,2, oder 3) ersetzt werden
    MsgBox(0,"DB5.DBW1", "$DB=" & $aArray4[0] & " $Byte=" & $aArray5[0] & " $Bit=" & $aArray6[0])

    [/autoit]

    Wie es sich bei wechselnder Strucktur zu machen läßt, das überlasse ich dann mal den Profi's. ;)
    Evtl. hilft es aber schon mal so weiter?!


    BEARBEITET:
    Ich habe gerade Deinen Beitrag "List View bestimmten Eintrag ausblenden" entdeckt.
    Du postes unter Lfd.-Nr.9 Deinen Code, jedoch kann man den nicht übernehmen, da die Include "LibNoDave.au3" benötigt wird.

    Aber was mir dort in Zeile 83 ff aufgefallen ist, ist das Du dort doch schon die Variable $DB, $Byte und $Bit verwendest.
    Schreibe Werte aus der InputBox in eine Txt-Datei durch z. B. | getrennt rein.

    Dann kannst Du diese Daten dann später auch aus der Textdatei direkt abfragen und somit ist das Grundproblem das Du hier im Beitrag hast doch gelöst, oder?


    Hier mal was zum Verständnis, wobei ich davon ausgehe, das die *.txt wie folgt aufgebaut ist:
    $IP_Adresse||DB.|DB.|DBX|Byte|Bit

    Erklärung:
    $data = _GUICtrlListView_GetSelectedIndices($hListView) = Ermittelt die Indizes der markierten Items für $data
    _GUICtrlListView_GetItemText($hListView, Abs($data)) = fragt das erste Feld von links ($IP_Adresse)
    _GUICtrlListView_GetItemText($hListView, Abs($data), 3) = fragt das dritte Feld von links ab (DB.)
    _GUICtrlListView_GetItemText($hListView, Abs($data), 6)) = fragt das sechste Feld von links ab (Bit)

    Spoiler anzeigen
    [autoit]


    $data = _GUICtrlListView_GetSelectedIndices($hListView)
    MsgBox(0, "Datensatz soll gedruckt werden", "Feld 0: " & _GUICtrlListView_GetItemText($hListView, Abs($data)) & _
    @CRLF & "Feld 3 " & _GUICtrlListView_GetItemText($hListView, Abs($data), 3) & _
    @CRLF & "Feld 6 " & _GUICtrlListView_GetItemText($hListView, Abs($data), 6))

    [/autoit]

    Ausführlich erklärt odr zu blond gedacht bei der Erklärung? ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    3 Mal editiert, zuletzt von Alina (24. Dezember 2013 um 22:11)

  • Hallo
    vielen dank für den Beitrag da werde ich mich morgen mal mit beschäftigen.
    Das mit der txt. Date kenne ich noch nicht. Ich beschäftige mich mit AutoIT erst seit kurzem. Werde ich auf jeden fall mal versichen.

    Noch eine Frage woher weißt du meinen Namen ?

    Der Code in#9 ist noch das alte Programm. Ich Poste noch mal das neue

    Ist aber noch nicht fertig. Es ist eine Abänderung des alten Programm. Die TCP Funktionen sind noch nicht abgeändert.
    die LibNoDave.au3 ist von Funky gibts im Forum
    LibNoDave-UDF zur Kommunikation mit Simatic SPS

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include "LibNoDave.au3"

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

    ; Globale Variablen
    Global $Anzahl ; Anzahl der IP Abfragen
    Global $GUI_IP_SPS
    Global $Socket_SPS ; Der Socket wird von _daveTCPConnect() beschrieben
    Global $di_SPS ; Das Device Interface wird von _daveTCPConnect() beschrieben
    Global $dc_SPS ; Die Device Connection wird von _daveTCPConnect() beschrieben
    Global $Name_SPS = "SPS-Name" ; Name wird bei Logging und Debugging ausgegeben
    Global $IP_SPS = ""
    Global $CPU_Rack = 0
    Global $CPU_Slot = 2

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

    Global $Status [20]

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

    Global $Run
    Global $iRet

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

    Global $Buffer

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

    ;Farben
    Global $Gruen= 0x00FF00
    Global $Weiss =0xFFFFFF

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

    #Region ### START Koda GUI section ### Form=c:\users\andreas\downloads\test1\libnodave\netzwerkanwesenheit sps.kxf
    $Form1_1 = GUICreate("Form1", 510, 445, 287, 134)
    $Menue_Main = GUICtrlCreateMenu("Menü")
    $Menue_Main_1 = GUICtrlCreateMenuItem("Erstellen", $Menue_Main)
    $Save = GUICtrlCreateMenuItem("Speichern", $Menue_Main)
    $Menue_Main_3 = GUICtrlCreateMenuItem("Löschen", $Menue_Main)
    $Menue_Main_4 = GUICtrlCreateMenuItem("Alle Löschen", $Menue_Main)
    $Menue_Main_5 = GUICtrlCreateMenuItem("Einstellung", $Menue_Main)

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

    $hListView = GUICtrlCreateListView("IP Adresse | Status IP | SPS Adresse |Status DB",10,50,490,200)

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

    $Menue_ListView = GUICtrlCreateContextMenu($hListView)
    $Menue_ListView_1 = GUICtrlCreateMenuItem("Löschen",$Menue_ListView)
    $Start = GUICtrlCreateButton("Start", 336, 272, 113, 41)
    $Stop = GUICtrlCreateButton("Stop", 336, 320, 113, 41)
    $Verbunden = GUICtrlCreateInput("Verbunden", 248, 272, 65, 21)
    $Label6 = GUICtrlCreateLabel("Anwesenheitserkennung IP Adresse" , 72, 8, 358, 28)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;*****************************************************************+Hauptprogramm**********************************************************
    ; Programm Start
    ;IP Adressen aus Config laden
    _LoadConfigGui()

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

    AdlibRegister ( "_Schritkette",10000) ;Funktion alle 5sec aufrufen

    While 1
    $nMsg = GUIGetMsg()


    Switch $nMsg

    Case $GUI_EVENT_CLOSE
    Exit


    Case $Menue_Main_1 ; Einfügen
    $IP_Adresse = InputBox("","Bitte IP Adresse von Handy oder PC eingeben")
    $DB = InputBox("","DB Nummer von SPS eingeben")
    $Byte = InputBox("","Byte Adresse von DB eingeben")
    $Bit = InputBox("","Bit Adresse von DB eingeben")
    GUICtrlCreateListViewItem($IP_Adresse &'|'&""&'|'& "DB."&$DB&"DBX"&$Byte&"."&$Bit&'|'&""&'|',$hListView)
    Case $Menue_Main_4 ; Alles Löschen
    _GUICtrlListView_DeleteAllItems($hListView)
    Case $Menue_ListView_1
    _GUICtrlListView_DeleteItemsSelected($hListView)


    Case $Start

    $run = 1
    ;GUICtrlSetData ($runGui, "run")


    Case $Stop
    $run = 0
    ;GUICtrlSetData ($runGui, "Stop")

    Case $save
    _SaveConfigGui()


    EndSwitch
    WEnd

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

    ;*****************************Funktionen********************************************************
    ;Schritkette Programm
    Func _Schritkette()
    if $run then
    $Anzahl = _GUICtrlListView_GetItemCount($hListView)
    ip_Abfrage()
    Sleep(1000)
    ;_TCPConnect()
    ;Sleep(1000)
    ;_Schreiben()
    ;Sleep(1000)
    ;_Lesen()
    ;Sleep(1000)
    ;_TCPDisconnect()
    EndIf
    EndFunc

    ; Funktiom Abfrab ob IP Online ist
    Func ip_Abfrage()

    For $i = 1 TO $Anzahl
    $aItem =_GUICtrlListView_GetItem($hListView, $i-1,0)
    $IP_X = ( $aItem[3]) ; Lese IP aus GUI


    $iPing = Ping($IP_X,250) ;Abfrage ob IP im Netzwerk vorhanden , Online ist
    If $iPing = 0 Then
    _GUICtrlListView_SetTextBkColor($hListView, $Weiss)
    _GUICtrlListView_SetItem($hListView, "Offline", $i-1,1)

    $Status[$i] = 0
    Else
    _GUICtrlListView_SetTextBkColor($hListView, $Gruen)
    _GUICtrlListView_SetItem($hListView, "Online", $i-1,1)


    $Status[$i] = 1
    EndIf

    Next
    EndFunc

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

    ;Input Werte Speicherin in int
    Func _SaveConfigGui()
    $_save = GUICtrlRead ($GUI_IP_SPS)
    IniWrite(@ScriptDir & "\setup.ini", "Adresse", "ip_SPS", $_save)

    For $i = 1 to $Anzahl
    $_save = GUICtrlRead ($GUI_IP[$i])
    IniWrite(@ScriptDir & "\setup.ini", "Adresse", "ip"&$i, $_save)
    $_save = GUICtrlRead ($GUI_DB[$i])
    IniWrite(@ScriptDir & "\setup.ini", "Datenbaustein", "DB"&$i, $_save)
    $_save = GUICtrlRead ($GUI_Byte[$i])
    IniWrite(@ScriptDir & "\setup.ini", "Datenbaustein", "Byte"&$i, $_save)
    $_save = GUICtrlRead ($GUI_Bit[$i])
    IniWrite(@ScriptDir & "\setup.ini", "Datenbaustein", "Bit"&$i, $_save)
    Next

    EndFunc

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

    ;Input werte lesen aus int
    Func _LoadConfigGui()
    $Load = IniRead(@ScriptDir & "\setup.ini", "Adresse", "ip_SPS" , "192.168.178.")
    GUICtrlSetData ($GUI_IP_SPS,$Load)
    For $i = 1 to $Anzahl
    $Load = IniRead(@ScriptDir & "\setup.ini", "Adresse", "ip" &$i, "192.168.178.")
    GUICtrlSetData ($GUI_IP[$i],$Load)
    $Load = IniRead(@ScriptDir & "\setup.ini", "Datenbaustein", "DB"&$i, "0")
    GUICtrlSetData ($GUI_DB[$i],$Load)
    $Load = IniRead(@ScriptDir & "\setup.ini", "Datenbaustein", "Byte"&$i, "0")
    GUICtrlSetData ($GUI_Byte[$i],$Load)
    $Load = IniRead(@ScriptDir & "\setup.ini", "Datenbaustein", "Bit"&$i, "0")
    GUICtrlSetData ($GUI_Bit[$i],$Load)
    Next

    EndFunc


    ;Status löschen wenn Programm Stop
    Func _Status_reset()
    For $i = 1 to $Anzahl
    GUICtrlSetData ($Radio[$i], "" ) ; Wenn IP Offline schreibe in GUI Offline
    Next
    EndFunc

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

    ;Verbindung aufbauen
    Func _TCPConnect()
    $IP_SPS = GUICtrlRead ($GUI_IP_SPS)
    _DaveInit()
    _daveTCPConnect($IP_SPS, $Socket_SPS, $di_SPS, $dc_SPS, $CPU_Rack, $CPU_Slot, $Name_SPS)

    If @error Then
    MsgBox(16, "Error " & @error, "TCP connection parameter incorrect for " & $Name_SPS & "!")
    Exit
    Else
    GUICtrlSetData ($Verbunden, "Verbunden" )
    EndIf
    EndFunc

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

    ;Schreiben
    Func _Schreiben()
    For $i = 1 to $Anzahl

    $iRet = _daveWriteBits($dc_SPS, $daveDB, GUICtrlRead ($GUI_DB[$i]), GUICtrlRead ($GUI_Byte[$i]), GUICtrlRead ($GUI_Bit[$i]), $Status[$i])
    If @error Or $iRet <> 0 Then
    MsgBox(16, "Error " "Fehler beim Schreiben")
    Else
    GUICtrlSetData ($Verbunden, "Schreiben" )
    EndIf
    Next
    EndFunc

    ;Lesen
    Func _Lesen()
    For $i = 1 to $Anzahl
    $iRet = _daveReadBit($dc_SPS, $daveDB, GUICtrlRead ($GUI_DB[$i]), GUICtrlRead ($GUI_Byte[$i]), GUICtrlRead ($GUI_Bit[$i]) )
    If @error Then
    MsgBox(16, "Error " "Lesefehler!")
    Else
    GUICtrlSetData ($Verbunden, "Lesen" )
    EndIf
    GUICtrlSetData ($GUI_Status[$i],$iRet)
    Next
    EndFunc

    ;Verbindung beenden
    Func _TCPDisconnect()
    _daveTCPDisconnect($Socket_SPS, $di_SPS, $dc_SPS)
    GUICtrlSetData ($Verbunden, "Getrennt" )
    EndFunc

    [/autoit]

    4 Mal editiert, zuletzt von emilio20 (24. Dezember 2013 um 23:19)

  • Moinidoini Andreas. ;)

    Wie ich weiß wie Du heißt?
    Gib mal in der foruminternen Suchfunktion folgendes ein: Form=c:\users\andreas\
    Das sollte für sich sprechen und es erklären.

    Da ich davon ausgegangen bin, das Du jung bist (Schüler/Azubi/Studi/...) bin ich
    auch davon ausgegangen, das Du an Deinem eigenen PC sitzt und so Deinen Namen
    veröffentlicht hast. Aber vorsichtig, das geht nicht immer gut, denn wer wie ich auch
    viel an anderen PC's sitzt (Arbeit oder Freunde) der hat da oftmals was anderes stehen.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Also _StringBetween würde ich nicht empfehlen. M.M. nach ist hier Regex optimal:

    [autoit]

    Global $sString = "DB5.DBX6.0"
    Global $DB, $Byte, $Bit
    Global $sPattern = "DB(\d+)\.DBX(\d+)\.(\d+)"

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

    Global $aMatch = StringRegExp($sString, $sPattern, 3)
    If IsArray($aMatch) Then
    $DB = $aMatch[0]
    $Byte = $aMatch[1]
    $Bit = $aMatch[2]
    EndIf

    [/autoit]
  • BugFix

    Aber das funktioniert nicht, wenn er, wie angegeben als $sString "DB5.DBW1" angiebt.
    Das zu lösen ist wohl nicht so einfach.
    Evtl. ist ja eine _StringBetween und RegEx Anwendung die Lsg.?
    ?(?(?(

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Aber das funktioniert nicht, wenn er, wie angegeben als $sString "DB5.DBW1" angiebt.


    OK, hatte ich nicht gesehen - aber kein Problem, dann passt man das Pattern an. ;)
    Habe das Ergebnis jetzt der Einfachheit halber mal in eine Struktur gepackt.

    [autoit]


    Global $tSBS = DllStructCreate("int DB;int Byte;int Bit;")
    Global $sPattern = "DB(\d+)\.DB[A-Z](\d+)(?:\.(\d+))?"
    Global $sString = "DB5.DBW1"
    Global $aMatch = StringRegExp($sString, $sPattern, 3)
    If IsArray($aMatch) Then
    For $i = 0 To UBound($aMatch) -1
    DllStructSetData($tSBS, $i+1, $aMatch[$i])
    Next
    EndIf

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

    ; == Syntax mit mit v 3.3.10.0
    ConsoleWrite('DB: ' & $tSBS.DB & @LF)
    ConsoleWrite('Byte: ' & $tSBS.Byte & @LF)
    ConsoleWrite('Bit: ' & $tSBS.Bit & @LF)

    [/autoit]