Suchfunktion funktioniert nicht bei Leerzeichen im String

  • Hab für mein Programm ne Suchfunktion erstellt die auch prima funktioniert... jedenfalls bis im Suchstring ein Leerzeichen enthalten ist, dann findet er nix mehr.
    Er liest den String aus der GUI, zb "Christ" und vergleicht dann mit der vorher erstellten Datei ob Einträge existieren die genauso anfangen.
    z.B wenn die Datei so aussieht:
    10001|Tom
    10002|Christopher
    10003|Gerd
    10004|Christian

    Da würde er mir die beiden Sachen raussuchen:
    Christopher
    Christian

    So nun hab ich aber folgende Datei: (nur BSP)
    10002|TEC Datensicherung|10.00
    10003|TEC Datensicherung2|50.00
    10004|DAT Kundendatei2|5.00

    und folgender Suchstring: "TEC Dat"
    Als Ergebnis erhalte ich nix ?( Nur wegen den Leerzeichen! Habt ihr ne Idee wie ich es umgehen kann?

    Hier die Funktion:

    Spoiler anzeigen
    [autoit]


    ;suche dienstleistung
    Dim $DLDAT[2]

    _FileReadToArray(@ScriptDir & "\data\dl.dat",$DLDAT)
    $maxlenghtSearchName = _ArraySize($DLDAT)
    $maxlenghtSearchName = $maxlenghtSearchName
    $searchnr = 1
    Dim $Founded[$maxlenghtSearchName]
    Dim $FoundedKDNR[$maxlenghtSearchName]
    Dim $FoundedPRICE[$maxlenghtSearchName]
    $fnr = 1
    Do
    $searchsplit = StringSplit($DLDAT[$searchnr],"|")
    $searchlenght = StringLen(GUICtrlRead($feld_artnrsuche))
    if StringLeft($searchsplit[2],$searchlenght) == GUICtrlRead($feld_artnrsuche) Then
    $Founded[$fnr] = $searchsplit[2]
    $FoundedKDNR[$fnr] = $searchsplit[1]
    $FoundedPRICE[$fnr] = $searchsplit[3]

    $fnr = $fnr + 1
    EndIf
    $searchnr = $searchnr + 1
    Until $searchnr == $maxlenghtSearchName

    ;gefundene Dienstleistungen ausgeben
    $maxlenghtSearchName = _ArraySize($Founded)
    $maxlenghtSearchName = $maxlenghtSearchName
    $searchnr = 1

    $ShowFounds = GUICreate("Gefundene Artikel", 405, 294)
    $FoundData = GUICtrlCreateListView("Bezeichnung", 0, 0, 401, 289)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    _GUICtrlListView_SetColumnWidth($FoundData, 0, 400)

    Do
    _GUICtrlListView_AddItem($FoundData,$Founded[$searchnr] , $searchnr)
    $searchnr = $searchnr + 1
    Until $searchnr == $maxlenghtSearchName

    ;gewählte DL/Artikel eintragen
    Sleep(500)
    Do
    if $GUI_EVENT_CLOSE == GUIGetMsg() Then
    ExitLoop
    EndIf
    Until GUIGetMsg() == -7 or GUIGetMsg() == -8 or _IsPressed("0D", $dll)

    $iS = ControlListView($ShowFounds, '', $FoundData, 'GetSelected')
    GUICtrlSetData($feld_artikelsuche,$Founded[$iS+1]) ;Name setzen
    GUICtrlSetData($feld_artnrsuche,$FoundedKDNR[$iS+1]) ;KD-Nr setzen
    GUICtrlSetData($feld_artikelpreis,$FoundedPRICE[$iS+1]) ;Preis setzen
    GUICtrlSetData($feld_mwst_R,"19.00") ; MwSt setzen
    GUICtrlSetData($feld_anzahl,"1") ; Anzahl setzen
    GUIDelete($ShowFounds)
    ;finish...

    [/autoit]

    Einmal editiert, zuletzt von chrisbyRRC (23. Juli 2010 um 20:40)

  • Ich auch, und hier ist auch direkt noch ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sString = _
    "10002|TEC Datensicherung|10.00" & @CRLF & _
    "10003|TEC Datensicherung2|50.00" & @CRLF & _
    "10004|DAT Kundendatei2|5.00"

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

    $sSuche = "Tec DAT"
    $aRet = _RegExp($sString,'(?i)\|([^|]*'&$sSuche&'[^|]*)\|([\d.]+)')
    _ArrayDisplay($aRet)

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

    Func _RegExp($sTest, $sPattern, $iOffset = 0)
    ; Easy RegExp with >1 Subpattern
    Local $aRet, $iUB, $iUB2, $aDummy, $aNewArr
    $aRet = StringRegExp($sTest, $sPattern, 4, $iOffset)
    If @error Then Return

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

    Local $iUB = UBound($aRet), $iUB2 = UBound($aRet[0]), $aNewArr[$iUB][$iUB2 - 1]
    For $i = 0 To $iUB - 1
    Local $aDummy = $aRet[$i], $iUBD = UBound($aDummy)

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

    If $iUBD - 1 > $iUB2 Then
    $iUB2 = $iUBD
    ReDim $aNewArr[$iUB][$iUB2]
    EndIf
    For $j = 1 To $iUBD - 1
    $aNewArr[$i][$j - 1] = $aDummy[$j]
    Next
    Next
    Return $aNewArr
    EndFunc ;==>_RegExp

    [/autoit]
  • @stayawayknight
    Also wenn ich die Funktion von StringRegExp() richtig verstanden habe dann ermöglicht es mir die Suchstrings mit Leerzeichen rauszufiltern. Aber das brauch ich ja garnicht. Ich möchte ermöglich auch nach Suchstrings mit Leerzeichen suchen zu können. Ist das irgendwie möglich? Oder woran liegt es überhaupt das er garnix findet? Er müsste doch auch das Leerzeichen mit
    vergleichen, oder?

    EDIT: Oha SEuBo,
    wo hasten so schnell nen Bsp. hergezaubert? :)
    Besten Dank dafür. ;) Werde mir das erstmal genau anschaun müssen, sieht ziemlich kompliziert aus. :wacko:

    Einmal editiert, zuletzt von chrisbyRRC (23. Juli 2010 um 19:37)

  • Um nochmal StringRegExp aufzugreifen:

    Es prüft, ob ein String eine bestimmte Zeichenfolge beinhaltet-also das was eine Suche auch macht. Mit den entsprechenden Parametern lassen sich auch alle Treffer zurückgeben zurückgeben... Was jeodch erstmal unwichtig ist

    SEuBo hat dazu ein sehr gutes Tutorial geschrieben, das sogar ich kapiert hab :)

    Bei deinem Beispiel:

    Spoiler anzeigen
    [autoit]


    ;Strings: (Würde sich noch besser mit Arrays lösen lassen)
    $string1 = "10002|TEC Datensicherung|10.00"
    $string2 = "10003|TEC Datensicherung2|50.00"
    $string3 = "10004|DAT Kundendatei2|5.00"
    $suchstring = "TEC Dat"

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

    If StringRegExp($string1, $suchstring) = 1 Then ;StringRegExp gibt 0 zurück wenn nix gefunden wurden, wenn was gefunden wurde gibt es 1 zurück
    MsgBox(0, "Enthalten", "String1 enthält den Suchstring!")
    ElseIf StringRegExp($string2, $suchstring) = 1 Then
    MsgBox(0, "Enthalten", "String2 enthält den Suchstring!")
    ElseIf StringRegExp($string3, $suchstring) = 1 Then
    MsgBox(0, "Enthalten", "String3 enthält den Suchstring!")
    EndIf

    [/autoit]

    Leerzeichen spielen bei StringRegExp keine Rolle, sie werden dargestellt durch:

    Code
    " "

    Einmal editiert, zuletzt von stayawayknight (23. Juli 2010 um 19:48)

  • Mal ehrlich, ich weiss nicht, warum ihr euch mit stringregexp() die Mühe macht!?
    Bei mir funktioniert der gepostete Ausschnitt nämlich einwandfrei....

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    ;suche dienstleistung
    $hgui=guicreate("")

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

    $feld_artnrsuche=guictrlcreateinput("TEC Dat",20,20,100,20) ;Suchstring Eingabe
    guisetstate()

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

    ;**********Kopierter, unveränderter Scriptteil********

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

    Dim $DLDAT[2]

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

    _FileReadToArray(@ScriptDir & "\data\dl.dat",$DLDAT)

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

    $maxlenghtSearchName = $DLDAT[0]
    $maxlenghtSearchName = $maxlenghtSearchName
    $searchnr = 1
    Dim $Founded[$maxlenghtSearchName]
    Dim $FoundedKDNR[$maxlenghtSearchName]
    Dim $FoundedPRICE[$maxlenghtSearchName]
    $fnr = 1
    Do
    $searchsplit = StringSplit($DLDAT[$searchnr],"|")
    $searchlenght = StringLen(GUICtrlRead($feld_artnrsuche))
    if StringLeft($searchsplit[2],$searchlenght) == GUICtrlRead($feld_artnrsuche) Then
    $Founded[$fnr] = $searchsplit[2]
    $FoundedKDNR[$fnr] = $searchsplit[1]
    $FoundedPRICE[$fnr] = $searchsplit[3]

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

    $fnr = $fnr + 1
    EndIf
    $searchnr = $searchnr + 1
    Until $searchnr == $maxlenghtSearchName

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

    ;************Auswertung*******************
    _arraydisplay($founded)
    _arraydisplay($FoundedKDNR)
    _arraydisplay($FoundedPRICE)

    [/autoit]


    wobei ich die "Suche" mit stringinstr() gemacht hätte statt stringleft(), aber naja^^

  • Ok habs jetzt in etwa kappiert. Auch wenn ichs noch nich hinbekommen hab... :rolleyes:
    Naja wär ja auch doof wenn alles auf Anhieb klappen würd. :) Oda ?(
    Auf jedenfall Danke für die Hilfe werd mir das nochmal reinhaun müssen. ^^

  • Mal ehrlich, ich weiss nicht, warum ihr euch mit stringregexp() die Mühe macht!?


    Du hattest mir da mal von einem Zitat erzählt :D
    "A tendency to overuse this new toy"

    Wenn ich eine Tabelle sehe, aus der irgendwas ausgelesen werden soll, und diese im Textformat vorliegt - Dann rate ich zu RegExp. Das spart viele Codezeilen.

  • Ja, aber jemandem, der offensichtlich nicht in der Lage ist, in seinem eigenen Script einen "Fehler" mit den simpelsten Hilfsmitteln (z.B. STRG+SHIFT+D oder ALT+D) zu finden zu Stringregexp() zu Raten, "weil es viele Codezeilen spart" (in diesem Fall keine einzige) halte ich für kontraproduktiv!
    Mal abgesehen davon, daß der "Fehler" wie von mir oben gezeigt, definitiv NICHT am Script liegt ;)

  • Ja habs auch grad bemerkt, tut mir echt leid! :D
    Hatte bei der StringLen aus dem falschen GUI-Feld ausgelesen. Dadurch hat er Strings die länger waren als die Art-Nr nicht genommen. SRY! :rolleyes:

  • Zitat

    Hatte bei der StringLen aus dem falschen GUI-Feld ausgelesen.

    hehe, meine Rede...aber war von mir ja nicht böse gemeint^^
    Daß das "Problem" in 90% aller Fälle ca 50cm vor dem Bildschirm sitzt, ist ja hinreichend bekannt :thumbup: