April 18, 2021, 00:44:00

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Nummer/Zeichenfolge aus Kontaktdaten generieren

Begonnen von BikeArno, März 25, 2021, 08:59:34

⏪ vorheriges - nächstes ⏩

BikeArno

März 25, 2021, 08:59:34 Letzte Bearbeitung: März 25, 2021, 17:00:39 von BikeArno Grund: Spezifizierung
Hallo,

ich stehe vor einer größeren Herausvorderungen und weiß nicht so recht, ob und wie mir Access da helfen kann.

Und zwar habe ich einen sehr großen Datensatz (ca. N=20.000), in dem es die Felder "Organisation" (z.B. Name eines Geschäfts oder Vereins) sowie die dazugehörige "Adressfelder" gibt (PLZ, Ort, Straße). Die Organisation kann aufgrund der Anlage des Datensatzes mehrfach vorkommen. Ziel ist es, den Organisationen in einem neuen Feld eine eindeutige ID zu geben (wobei mögliche kleinere Schreibfehler zu berücksichtigen sind). Dadurch soll man am Ende auch die Anzahl der Organisationen (ohne die Mehrfachnennungen) bestimmen können.

Für mich klingt das erstmal unlösbar. Man könnte natürlich händisch alle Organisationen und deren Adressen abgleichen und dann eine ID vergeben, jedoch ist das aufgrund der schieren Masse und Fehleranfälligkeit quasi unmöglich. Gibt es einen Weg, aus den vorhandenen Namen (oder einem Teil davon) und den Adressdaten (oder Teilen davon) eine ID zu generieren? Dabei müssen wie gesagt auch Tipp- und Schreibfehler berücksichtigt werden.

Ich hoffe, ich habe mich verständlich ausgedrückt. Im Anhang habe ich einen kurzen Beispieldatensatz hochgeladen (inkl. möglicher Fehlangaben), damit deutlicher wird, worum es geht.

Gruß   


wobei auch Schreibfehler möglich sind

ebs17

ZitatTipp- und Schreibfehler berücksichtigt werden
Recherchiere nach Ähnlichkeitssuche.

Ausgehend von einer einmaligen Bereinigung von Altlasten würde man aber einen User weniger tippen lassen, sondern vorhandene Organisationen bei der Eingabe anbieten, bei Bedarf auch zwanghaft.
Mit freundlichem Glück Auf!

Eberhard

BikeArno

März 25, 2021, 14:22:02 #2 Letzte Bearbeitung: März 25, 2021, 15:02:41 von BikeArno
Hallo,

daran habe ich auch schon gedacht, allerdings erhalte ich die Daten von einem Dienstleister und habe das Projekt auch "geerbt". Der User tippt also für den externen Dienstleister...

Deshalb wollte ich (auch) zur "Altlastenbereinigung" zunächst im ersten Schritt eine Nummer/Zeichenfolge auf Basis gegebener (oder Teile davon) Felder vergeben, um identische Vorhaben (basierend auf Name, Adresse) schneller zuordnen zu können, evtl. auf phonetischer Ähnlichkeit beruhend, um mögliche Tippfehler einzuschließen (siehe meine Beispieldatei oben im Anhang). Diese Nummer soll später auch als "Organisationsnummer" dienen.

Ich bezeichne mich immer noch als Laie und habe noch nie vor einem ähnlichen Problem gestanden - deshalb drücke ich mich evtl. etwas unbeholfen aus. Ist mein Vorhaben möglich und wenn ja, wie verfährt man da am besten?

Der Tipp mit der Ähnlichkeitssuche (kannte ich nicht) ist sicher später für den Abgleich mit neuen Datensätzen sehr sinnvoll, Danke.



 

ebs17

Zitatwie verfährt man da am besten?
Wende Dich an den Dienstleister? Es ist allermeist am leichtesten, direkt bei einer Dateneingabe zu prüfen und zu validieren.

Namen auf Richtigkeit, Ähnlichkeit und Gleichheit prüfen zu wollen ist sowieso eine Herausforderung:
Schmidt - Schmitt - Schmied ... ist das verschrieben oder jemand ganz anderes ...?

ZitatIch bezeichne mich immer noch als Laie
An dieser Aufgabe kannst Du kräftig wachsen. Allerdings sollte da gehörig Eigeninitiative und -recherche eingesetzt werden. Wenn man sich da in der Hängematte zu einer Lösung tragen lassen will, ist man fehl am Platze.
Mit freundlichem Glück Auf!

Eberhard

BikeArno

Zitat von: undefinedWenn man sich da in der Hängematte zu einer Lösung tragen lassen will, ist man fehl am Platze.

Es wäre sehr schön, wenn ich dafür in der Hängematte liegen könnte, bei einem aktuellen 12-Stunden-Arbeitstag  :-\  Zudem dachte ich, dieses Forum hier ist auch für "Laien" da, Fragen zu stellen? Aufgrund vieler hilfreicher Antworten hier konnte ich jedenfalls schon einiges Lernen und bin dankbar dafür. So richtig hilfreich war dein Hinweis an dieser Stelle aber nicht.  

Nochmal zum Problem: Ich habe mich jetzt mehrere Stunden mit Materialien von Josef Syrovatka zur (phonetischen) Ähnlichkeitssuche befasst, auch  mit seiner Beispieldatenbank, die man im Netz findet. Doch das ist vermutlich viel zu komplex für mein Vorhaben und im ersten Schritt noch nicht nötig. Damit beschäftige ich mich später.

Ich reduziere deshalb nochmal mein Ziel: Aus dem (Teil-)Inhalt von 3 Feldern möchte ich eine kombinierte Zeichenfolge oder Nummer in einem Feld generieren. Ist so etwas umsetzbar, wenn ja wie?

Danke und Gruß

MzKlMu

Hallo,
Du solltest als erstes mal die Tabelle erst mal manuell (per Augeschein) prüfen was überhaupt doppelt (oder mehrfach) ist.
Und dann würde ich alles was nicht doppelt ist mal in eine neue Tabelle packen.
Und dann prüfst Du den Rest.
Ich fürchte auch, Du wirst um eine manuell Prüfung nicht herumkommen. Du kannst keine Regel aufstellen die Dir das abnimmt.
Und wenn alles fertig ist, kommt in die Tabelle ein Autowert als Primärschlüssel. Ein Schlüsselfeld das aus mehreren Feldern generiert wird, ist Text und damit als Schlüsselfeld eher ungeeignet.

PS:
Zitat von: undefinedUnd zwar habe ich einen sehr großen Datensatz (ca. N=20.000),
Du solltest Dir um Verwirrungen zu vermeiden die Access Nomenklatur zu eigen machen.
Das ist kein großer Datensatz, sondern eine Tabelle mit 20.000 Datensätzen.
Eine Tabellenzeile = ein Datensatz
0 oder viele Datensätze = Tabelle
Mehrere Tabellen = Datenbank (aber dazu wird es erst mit den Beziehungen und RI)
Gruß
Klaus

BikeArno

Zitat von: MzKlMu am März 25, 2021, 16:32:50Und wenn alles fertig ist, kommt in die Tabelle ein Autowert als Primärschlüssel.

Danke Klaus, guter Tipp.

Zum Verständnis für mich, weil ich mich da grade "festgebissen" habe: Kann ich denn nicht aus einer gezielten Kombination der Inhalte mehrerer Felder (also z.B. jeweils 1. bis 3. Zeichen) ein Feld mit kombinierten Inhalt erstellen? Es soll kein Primärschlüssel sein. Nur aus Prinzip und um es zu verstehen.

Also z.B. wird aus "Fleischerei" in "04103" "Badergasse" der Code: Fle041Bad". Das müsste man doch im Entwurfsmodus einer Abfrage umsetzen können? Ich bekomme es mit meiner bescheidenen Kompetenz aber nicht hin. Ich kann nur den kompletten Feldinhalt mittels [Feld1] & " " & [Feld2] usw. verknüpfen, was ich aber nicht will.

Gruß 

MzKlMu

Hallo,
natürlich geht das.
Code: Links(Feld1;3) & Links(Feld2;3) & Links(Feld3;3)In einer Abfrage.
Aber welchen Sinn soll das machen?
Schlosserei  67112  Badergasse
Schneiderei  67115  Badstraße
Erzeugt den gleichen Code.
Du müsstest 4 Buchstaben verwenden und irgendwann passt das auch nicht.
Gruß
Klaus

BikeArno

Danke Klaus, das hilft mir weiter. Zum Sinn: Ich wollte es einfach gerne verstehen. Evtl. könnte mich die Funktion auch bei Datenbereinigungsprozessen unterstützen.

Nochmal Danke und Gruß

crystal

Hallo BikeArno,

die Idee, einen Pseudo-Schlüssel ("Match-Code") aus 3 Feldern zusammenzusetzen, ist sicher nicht so schlecht.
Ich würde aber
1. die PLZ komplett nehmen
2. aus Name und Straße 6 Zeichen
3. die Teile mit einem Zeichen trennen, z.B. "-"
4. Umlaute unwandeln (z. B. ä = ae)
5. alles in Kleinbuchstaben wandeln
6. Sonderzeichen entfernen (- . _ etc)
7. führende Leerzeichen entfernen

Beispiele:
1. 70173-muelle-dorfst (Fa. Müller, Dorfstraße 1, 70173 Stuttgart)
2. 70137-muelle-dorfst (Tippfehler in PLZ)
3. 70173-muelle-dorfst (eingegeben als Mueller, Dorfstr. 1, 70173 Stuttgart)
4. 70173-muelle-dorfst (eingegeben als Müller, Dorf-Str. 1, 70173 Stuttgart)
Hier sieht man schon, dass alles eigentlich den gleichen Kunden meint, wobei die Schlüssel 1, 3 und 4 sogar identisch sind.

Einen solchen Schlüsselwert würde ich am einfachsten mit einer globalen Funktion erzeugen (zu schreiben in einem Modul!), grob etwa so (Luftcode):

public function MatchCodeMachen(lngPLZ as long, strName as string, strStrasse as string) as string
 
  MatchCodeMachen =  trim(cstr(lngPLZ)) & "-" & _
                      Wandeln(strName) & "-" & _
                      Wandeln(strStrasse)
 
end function

Public Function Wandeln(ByVal strWert as string) as string

  strWert = replace(strWert,"ß","ss")
  strWert = lcase(trim(strWert))
  strWert = replace(strWert,"ä","ae")
  strWert = replace(strWert,"ö","oe")
  strWert = replace(strWert,"ü","ue")
  strWert = replace(strWert,"-","")
  strWert = replace(strWert,"_","")
  strWert = replace(strWert,".","")
  strWert = replace(strWert," ","")

  Wandeln = left(strWert,6)

end function

und in einer Abfrage ungefähr so einsetzen (mit Original-Werten zum Vergleich):
select MatchCodeMachen([FeldPLZ], [FeldName], [FeldStrasse]) as MatchCode, [FeldName], [FeldPLZ], [FeldStrasse] from Tabelle;

(Könnte man natürlich auch als Aktualisierungs-Abfrage machen...)

Mit so einem Gerüst könntest du erstmal experimentieren und einfach mal z. B. 200 Adressen checken (aus der Original-Tabelle in eine Spieltabelle kopieren).

NATÜRLICH ist mein Code sehr primitiv; könnte man auch mit RegEx machen und Übergabe-Werte prüfen... Aber so ist er einfach zu verstehen und zu erweitern.

Die Funktion "MatchCodeMachen" könntest du auch in einem Formular aufrufen (für neue Datensätze).

Dann könntest du noch ein Endlos-Formular bauen, das alle Adressen zu jedem Matchcode auflistet (Group By); das wird dann aber sehr lang bei 20.000 Datensätzen. Könnte auch sein, dass Access da nicht mitspielt, weil es zu viele Group-By-Werte gibt. Muss man probieren. Auch wäre eine 1:n-Beziehung besser (Matchcode in separate Tabelle auslagern mit Verweis auf den Primärschlüssel der Original-Tabelle). Das führt jetzt aber schon zu weit und geht in die Richtung "Was willst du mit so einem Matchcode praktisch, also für den Anwender, erreichen?".

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

BikeArno

Danke Crystal,

diese Vorgehensweise funktioniert erstaunlich gut, auch wenn es nur ein Hilfsmittel ist.

Gruß