String im Suchmuster von StringRegExp - damit zuordnen/sortieren

  • Hi,
    ich habe hier eine Datenbank (wenn man das seltsame Teil so nennen kann).
    Die "NBR_Calls" sind mir bekannt und in einer seperaten Liste vorhanden.

    Jetzt soll jeder passende "DName" zum "NBR_Call" gefunden werden.

    Mit StringRegExp wollte ich den Vorgang schon automatisieren.
    In der Theorie ists auch ganz einfach... aber in der Praxis wills einfach nicht funktionieren.

    [autoit]


    Global $NBR[4] = ["5f6874gboqvvcf455738jse6h","169pp798bnm6n7143bc74","2998b0gtzu4fjj88h44nss3m122n97411","144jhdn849myqtz67cm5mm3"] ;~ die vorgegebenen NBR_Calls

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

    $String = 'Entry = DName: "File/BrushP.bsh", Radio: "1.789", NBR_Call: "5f6874gboqvvcf455738jse6h", MAG: true, config: "/config.cfg", profile: 0' & @CRLF & _ ;~ ein Teil der eingelesenen Datenbank
    'radio: "33.4", config: "/config.cfg", profile: 1, nbr_call: "2998b0gtzu4fjj88h44nss3m122n97411", dname: "File/Filter9.fl", mag: false' & @CRLF & _
    'Entry = dname: "File/SquareAA.sqr", radio: "250", nbr_call: "169pp798bnm6n7143bc74", mag: false, config: "/config.cfg", profile: 1' & @CRLF & _
    'config: "/config.cfg", profile: 0, NBR_Call: "144jhdn849myqtz67cm5mm3", Radio: "500.750", DName: "File/SetB.set", MAG: true'

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

    For $i = 0 To UBound($NBR)-1 ;~ damit die Reihenfolge der NBR_Calls eingehalten wird
    $Filter = StringRegExp($String,'(?i)^.*?dname: "file/(.*?)".*?nbr_call: "' & $NBR[$i] & ' ".*?$',1) ;~ damit 100%ig der passende DName gefunden wird
    If @Error = 1 Then $Filter = StringRegExp($String,'(?i)^.*?nbr_call: "' & $NBR[$i] & ' ".*?dname: "file/(.*?)".*?$',1)
    If @Error = 1 Then
    MsgBox(0,"Fehler","Falsches Suchmuster - Eintrag: " & $i+1)
    ExitLoop
    EndIf

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

    ConsoleWrite($Filter[0] & ";" & $NBR[$i] & @CRLF)
    Next

    [/autoit]

    Könntet ihr mir bitte helfen?
    Oder hättet ihr andere Ideen oder Verbesserungsvorschläge?


    Gruß
    Tron

    2 Mal editiert, zuletzt von Tron (14. Juni 2011 um 10:25)

  • Also wenn die Reihenfolge in $NBR beibehalten werden soll dann wäre ein Vorschlag das Array so zu belassen und zusätzlich ein Dictionary zu schaffen um den jeweiligen DName nachzuschlagen.
    Könnte man mit einem 2D-Array realisieren (dann könnte man die Reihenfolge auch direkt übernehmen und das alte Array wieder wegwerfen) oder mit einem zusätzlichen Dictionary-Objekt:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>

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

    Global $NBR[4] = ["5f6874gboqvvcf455738jse6h", "169pp798bnm6n7143bc74", "2998b0gtzu4fjj88h44nss3m122n97411", "144jhdn849myqtz67cm5mm3"] ;~ die vorgegebenen NBR_Calls

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

    $String = 'Entry = DName: "File/BrushP.bsh", Radio: "1.789", NBR_Call: "5f6874gboqvvcf455738jse6h", MAG: true, config: "/config.cfg", profile: 0' & @CRLF & _ ;~ ein Teil der eingelesenen Datenbank
    'radio: "33.4", config: "/config.cfg", profile: 1, nbr_call: "2998b0gtzu4fjj88h44nss3m122n97411", dname: "File/Filter9.fl", mag: false' & @CRLF & _
    'Entry = dname: "File/SquareAA.sqr", radio: "250", nbr_call: "169pp798bnm6n7143bc74", mag: false, config: "/config.cfg", profile: 1' & @CRLF & _
    'config: "/config.cfg", profile: 0, NBR_Call: "144jhdn849myqtz67cm5mm3", Radio: "500.750", DName: "File/SetB.set", MAG: true'

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

    ; String auswerten und dabei in einem Dictionary jedem NBR einen DName zuweisen:
    Global $o_NBRDict = ObjCreate("Scripting.Dictionary")
    For $i In StringSplit($String, @CRLF, 2)
    $a_DNAME = _StringBetween($i, 'dname: "', '"')
    If @error Or Not IsArray($a_DNAME) Then ContinueLoop
    $a_NBR = _StringBetween($i, 'NBR_Call: "', '"')
    If @error Or Not IsArray($a_NBR) Then ContinueLoop
    $o_NBRDict($a_NBR[0]) = $a_DNAME[0]
    Next

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

    ; Gehe alle NBRs durch und schlage ihren zugehörigen DName im Dictionary nach:
    For $s_NBR In $NBR
    MsgBox(0, "", "NBR: " & $s_NBR & @CRLF & "DName: " & $o_NBRDict($s_NBR))
    Next

    [/autoit]
  • Ich hab jetzt mal nur versucht ne RegEx zu bauen, herraus kam das:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $NBR[4] = ["5f6874gboqvvcf455738jse6h","169pp798bnm6n7143bc74","2998b0gtzu4fjj88h44nss3m122n97411","144jhdn849myqtz67cm5mm3"]

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

    $String = 'Entry = DName: "File/BrushP.bsh", Radio: "1.789", NBR_Call: "5f6874gboqvvcf455738jse6h", MAG: true, config: "/config.cfg", profile: 0' & @CRLF & _
    'radio: "33.4", config: "/config.cfg", profile: 1, nbr_call: "2998b0gtzu4fjj88h44nss3m122n97411", dname: "File/Filter9.fl", mag: false' & @CRLF & _
    'Entry = dname: "File/SquareAA.sqr", radio: "250", nbr_call: "169pp798bnm6n7143bc74", mag: false, config: "/config.cfg", profile: 1' & @CRLF & _
    'config: "/config.cfg", profile: 0, NBR_Call: "144jhdn849myqtz67cm5mm3", Radio: "500.750", DName: "File/SetB.set", MAG: true'

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

    For $i = 0 To UBound($NBR)-1
    $Filter = StringRegExp($String,'(?i)(?U)(?:DName: "File/(.*)".*' & $NBR[$i] & '|' & $NBR[$i] & '.*DName: "File/(.*))"',1)
    ConsoleWrite($Filter[Ubound($Filter)-1] & ";" & $NBR[$i] & @CRLF)
    Next

    [/autoit]

    Lässt sich sicherlich noch optimieren, aber soviel Zeit hab ich jetzt nicht^^

    • Offizieller Beitrag

    Wenn ich das richtig sehe, gehören zu einem DName immer die Profile 0 und 1 und somit zwei nbr_call.
    Unter der Voraussetzung, dass in der existierenden Datenbank die Zeilenumbrüche identisch sind, wie von dir gepostet, würde sich folgendes Pattern nutzen lassen:
    (?i)dname: "([\w/.]+)".+nbr_call: "(\w+)".+\r\n.+nbr_call: "(\w+)"
    Mit Flag 3 im RegExp erhältst du dann folgendes Array:
    [DName1,nbr_call(Profil 0),nbr_call(Profil 1),DName2,nbr_call(Profil 0),nbr_call(Profil 1),...]

    Dann kannst du dieses Array mit Schrittweite 3 (DName) durchwandern und mit deiner Vorgabe vergleichen.