Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Namensabfrage mit Wildcards

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 26.08.2022, 17:23    Titel: Namensabfrage mit Wildcards Antworten mit Zitat

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, 13:55, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 26.08.2022, 18:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 26.08.2022, 23:31    Titel: Antworten mit Zitat

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 grinsen ).
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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 28.08.2022, 12:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 28.08.2022, 14:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 28.08.2022, 14:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz