Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 26.08.2022, 18:23 Titel: Namensabfrage mit Wildcards |
|
|
Ich habe ein Programm geschrieben mit dem ich - nach Eingabe von mindestens 3 Anfangsbuchstaben des Namens - die Spitznamen und Daten der Vereinsmitglieder in der Konsole ansehen kann.
Nun bin ich aber auf das Problem gestoßen, dass es Mitglieder gibt die Zeichen verwenden, die man über die Tastatur nicht direkt eingeben kann.
Z.B. hat einer den Spitznamen "H2O" wobei das "O" der Ascii-Wert 167, also ein kleines, hoch gestelltes "o" ist. In diesem Fall konnte ist das Problem leicht umgehen indem ich das Programm so änderte, dass 2 Zeichen zur Suche genügen. Das kann aber leicht ins Auge gehen weil man da schnell bei einer sehr hohen Zahl von Treffern sein kann (bei nur 1 Zeichen, kam ich mi "H" weit über 1000!)
Nun dachte ich mir, ich könnte das Problem mit Wildcards umgehen indem ich z.B. mit "H2?" suche. Das würde wahrscheinlich auch helfen wenn schon das erste Zeichen des Namen so ein Ascii-Code ist. Ich denke, dass ich das Problem auf 1 Fragezeichen in der Abfrage einschränken könnte.
Ist so etwas mit Freebasic leicht zu realisieren oder wäre das sehr aufwändig?
Ich denke dazu müsste ich die Suchstrings in den Teil vor und den Teil nach dem Fragzeichen zerlegen und die beiden Teile einzeln vergleichen? Oder gibt es dafür Hilfsmittel? _________________ Grüße
kilix
Zuletzt bearbeitet von kilix am 28.08.2022, 14:55, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 26.08.2022, 19:37 Titel: |
|
|
So wie bereits von mir angerissen habe ich das Problem für 1 Wildcard je Abfrage gelöst. Das war doch sehr einfach.
Komplizierter wird es dann mit mehr Wildcards. Ich denke aber, dass ich für diese Abfrage mit einem Wildcard das Auslangen finden sollte. _________________ Grüße
kilix |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 27.08.2022, 00:31 Titel: |
|
|
Du kannst natürlich erst einmal Zeichen für Zeichen parsen und abbrechen, sobald es nicht mehr stimmt. Für Wildcard '?' ist das sehr simpel; für '*' habe ich da keine so einfache Idee im Kopf (vielleicht über mehrere INSTR-Suchen; ist sicher lösbar, aber nicht ganz so auf die Schnelle am späten Abend ).
Für das '?' hier ein schneller Entwurf, ist aber nicht getestet:
Code: | FUNCTION suche(eingabe AS STRING, suchstring AS STRING) AS BOOLEAN)
IF LEN(suchstring) > LEN(eingabe) THEN RETURN FALSE
FOR i AS INTEGER = 0 TO LEN(suchstring)-1
IF suchstring[i] <> ASC("?") AND suchstring[i] <> eingabe[i] THEN RETURN FALSE
NEXT
RETURN TRUE ' suchstring kommt in eingabe vor
END FUNCTION |
Wenn du es deutlich professioneller willst, kannst du mit RegEx (regulären Ausdrücken) arbeiten, aber da muss man sich in Ruhe einarbeiten. Die Bibliotheken findest du hier: https://www.freebasic-portal.de/befehlsreferenz/externe-bibliotheken-639.html _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 28.08.2022, 13:21 Titel: |
|
|
Danke für deinen Vorschlag.
Interessant, für mich, ist die Zerlegung der Strings "EINGABE" und "SUCHSTRING" in ihre Zeichen durch die Schreibweise "EINGABE[i]" bzw. "SUCHSTRING[i]. Das verkürzt auch meine Idee einer Funktion denn nach meinem bisherigen Wissen hätte ich die Zerlegung mit Hilfe eine Tabelle gelöst.
Was die Suche mit "*" betrifft so ürde es genügen den "*" an den Beginn der Abfrage zu stellen wenn die gesuchte Zeichenkombination nicht am Anfang des Namens steht sondern irgendwo mittendrin und das ließe sich einfach mit "INSTR" lösen. Beispiel "*ayb" alle "Mayberg" und "Mayburg" etc. als Ergebnis.
Einen "*" in der Mitte der Abfrage brauche ich nicht weil es nicht nötig ist nach 2 Zeichenketten zu suchen.
Der "*" am Ende der Abfrage ist auch nicht nötig denn ich suche immer von links nach rechts und wenn ich fündig wurde ist alles richtig was dach steht.
Sobald ich dazu komme werde ich testen. Die Suche mit "*" kann ich dann leicht als alternative Suchmöglichkeit einbauen.
Edit: Frage gelöscht, da geklärt _________________ Grüße
kilix |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 28.08.2022, 15:21 Titel: |
|
|
Noch schnell zu eingabe[i]: Das liefert den ASCII-Code des Zeichens an der i-ten Position, wobei das erste Zeichen die Position 0 besitzt. Im Gegensatz zu INSTR, LEFT, MID usw. werden hier keine Fehler abgefangen; es ist also wichtig, nicht über die Stringlänge hinaus zu lesen oder gar zu schreiben (Speicherzugriffsfehler, der auch gern mal unbemerkt bleibt).
Ein einzelnes Wildcard-Zeichen * ist nicht so das Problem; zusammen mit einem ? wird es aber komplizierten (also wenn du zum Beispiel "Meyer", "Meier", "Huber-Meyer" usw. mithilfe von "*Me?er" suchen willst. Wahrscheinlich muss du dann von jeder möglichen Startposition aus (solange, bis der Reststring zu kurz ist) einen Suchlauf starten, bis du fündig wirst oder auch der letzte Suchlauf scheitert. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 28.08.2022, 15:35 Titel: |
|
|
Danke für die Hinweise!
Was den ersten Absatz betrifft habe ich das auch so verstanden.
Zu den Wildcards: die Kombination von "*" und "?" schließe ich aus (aber danke für den Hinweis, das sollte ich bei der Eingabe noch abfangen!). Für "?" habe ich deinen Code schon eingebaut, er funktioniert mit und ohne "?" und auch bei mehreren "?".
In der Funktion habe ich noch das Wildcard "*" eingebaut, auch das funktioniert gut (auch hier muß ich noch eine Prüfung der Eingabe ergänzen).
Danke für die Hilfe, ist eine elegantere Lösung als meine, mit der Tabelle, gewesen wäre _________________ Grüße
kilix |
|
Nach oben |
|
 |
|