Duplikate aus Textdateien entfernen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Nehmen wir an, Sie erhalten zwei Textdateien mit E-Mail-Adressen, die teilweise gleich sind. Manche E-Mail-Adressen kommen aber nur in der ersten Textdatei vor und andere nur in der zweiten. Wir benötigen aber eine Liste, die alle E-Mail-Adressen enthält, die in mindestens einer der beiden Listen vorkommen. Bei einer kurzen Liste würde man die beiden wahrscheinlich nebeneinanderlegen und abgleichen, aber ab einer gewissen Anzahl wird es unübersichtlich und somit fehleranfällig. Also bemühen wir einfach unsere Lieblingsanwendung – Microsoft Access!

Listen nach Access

Die beiden Textdateien enthalten in unserem Beispielfall jeweils eine Liste von E-Mail-Adressen, Anreden und einer Statusinformation – alles für die spätere Nutzung in einem Newsletter (siehe Bild 1). Um aus den beiden Listen eine Liste mit allen vorkommenden E-Mail-Adressen zu machen, müssen wir diese zunächst in Access verfügbar machen. Dann bauen wir eine Abfrage, welche alle E-Mail-Adressen der beiden Listen so zusammenführt, dass jede nur einmal auftaucht. Diese können wir dann als neue Textdatei exportieren.

Zwei zusammenführende Textdateien

Bild 1: Zwei zusammenführende Textdateien

Schritt für Schritt

Ob wir die Listen einmalig nach Access importieren oder diese als verknüpfte Tabellen verfügbar machen, hängt jeweils vom Anwendungsfall ab. Wenn es öfter vorkommt, dass Sie solche Listen zusammenführen müssen, können Sie eine Verknüpfung herstellen und dann jeweils die Dateien austauschen. Wir wollen an dieser Stelle allerdings aus Performancegründen einen Import vornehmen, denn wenn die Daten sich in einer Access-Tabelle innerhalb der Datenbank befinden, können wir besser damit arbeiten, als wenn wir über eine Verknüpfungstabelle auf eine externe Textdatei zugreifen.

Also rufen wir zunächst den Ribbon-Befehl Externe Daten|Importieren und Verknüpfen|Neue Datenquelle|Aus Datei|Textdatei auf (siehe Bild 2). Im ersten Schritt des nun erscheinenden Assistenten wählen Sie die zu importierende Datei aus und behalten die Option Importieren Sie die Quelldaten in eine neue Tabelle in der aktuellen Datenbank bei. Danach folgt der Textimport-Assistent. Hier gehen Sie gleich weiter zur zweiten Seite des Assistenten und aktivieren dort die Option Erste Zeile enthält Feldnamen (siehe Bild 3). Auf der dritten Seite gibt es nichts zu tun, auf der vierten behalten Sie die Option Primärschlüssel soll von Access hinzugefügt werden bei. Auf der letzten Seite legen Sie noch den Namen der Tabelle fest, unter der die importierten Daten gespeichert werden sollen. Wir verwenden den Namen tblEMail1.

Start des Imports einer Textdatei

Bild 2: Start des Imports einer Textdatei

Einstellung der Option Erste Zeile enthält Feldnamen

Bild 3: Einstellung der Option Erste Zeile enthält Feldnamen

Nach dem Import fragt der Assistent im letzten Schritt, ob die Importschritte gespeichert werden sollen. Dies wollen wir in diesem Fall einmal tun, da wir ja gegebenenfalls noch öfter Daten auf die gleiche Art importieren wollen (siehe Bild 4). Auf die gleiche Art und Weise importieren wir nun auch die zweite Textdatei, diesmal allerdings in die Zieltabelle tblEMails2. Auch diesen Import können wir speichern.

Speichern der Importschritte

Bild 4: Speichern der Importschritte

Abfrage zum Zusammenführen der Datensätze

Nun kümmern wir uns um die Abfrage, welche die Datensätze zusammenführen soll, ohne Duplikate zu liefern. Der neuen Abfrage namens qryEMailAdressenZusammenfuehren fügen wir zunächst die beiden Tabellen tblEMails1 und tblEMails2 als Datenherkunft hinzu – allerdings nicht auf herkömmliche Weise über die Entwurfsansicht, sondern über die SQL-Ansicht. Der Grund ist, dass wir eine UNION-Abfrage nutzen wollen, um die Datensätze der beiden Tabellen zusammenzuführen.

Dazu geben Sie dann den folgenden Text ein:

SELECT EMail, MailAnrede, Status FROM tblEMails1
UNION
SELECT EMail, MailAnrede, Status FROM tblEMails2

Die erste Beispieltabelle hat 674 Datensätze, die zweite hat 672. Die erste Tabelle enthält ein paar Datensätze, die nicht in der zweiten Tabelle vorkommen und umgekehrt. Das Ergebnis der UNION-Abfrage liefert 675 Datensätze. Das scheinen zu wenige Datensätze zu sein: Es würde ja bedeuten, dass die zweite Tabelle nur einen Datensatz enthält, der nicht in der ersten Tabelle vorkommt, und das ist nicht der Fall – davon haben wir uns zuvor durch überfliegen der beiden Tabellen überzeugt.

Also prüfen wir genau, wie viele Datensätze in beiden Tabellen vorkommen – und verschaffen uns so eine kleine VBA-Fingerübung. Hier gehen wir von der Anzahl der Datensätze in der ersten Tabelle aus, die wir mit der DCount-Funktion ermitteln:

Public Sub DatensaetzeZaehlen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim lngAnzahl As Long
     Set db = CurrentDb
     lngAnzahl = DCount("*", "tblEMails1")

Dann erstellen wir ein Recordset auf Basis der Tabelle tblEMails2 und durchlaufen alle Datensätze dieses Recordsets. Dabei prüfen wir für jeden Datensatz, ob dieser auch in der Tabelle tblEMails1 vorkomme. Falls nicht, erhöhen wir lngAnzahl jeweils um 1:

     Set rst = db.OpenRecordset("tblEMails2", _
         dbOpenDynaset)
     Do While Not rst.EOF
         If Nz(DLookup("EMail", "tblEMails1", "EMail = ''''" _
                 & rst!EMail & "''''"), "") = "" Then
             lngAnzahl = lngAnzahl + 1
         End If
         rst.MoveNext
     Loop

Das Ergebnis geben wir dann im Direktfenster aus:

     Debug.Print lngAnzahl
End Sub

Diese Prozedur liefert als Ergebnis für die gemeinsamen Datensätze den Wert 678, was realistisch erscheint. Wie können wir dieses per Abfrage nachbilden

In tblEMails1, aber nicht in tblEMails2

Um herauszufinden, wie viele E-Mails in der Tabelle tblEMails1 vorhanden sind, die wir nicht in tblEMails2 finden, erstellen wir die Abfrage aus Bild 5.

Datensätze in tblEMails1, aber nicht in tblEMails2

Bild 5: Datensätze in tblEMails1, aber nicht in tblEMails2

Dies liefert sechs Datensätze, was das Ergebnis der VBA-Prozedur bestätigt (siehe Bild 6). Wenn wir die 672 Datensätze aus tblEMails2 zugrunde legen und die 6 aus der Abfrage hinzuaddieren, kommen wir auch auf 678.

Datensätze in tblEMails1, aber nicht in tblEMails2 - Datenblattansicht

Bild 6: Datensätze in tblEMails1, aber nicht in tblEMails2 – Datenblattansicht

Andersherum können wir das auch noch machen, um das Ergebnis abzusichern. Hier kommt dann 4 heraus, was in Addition mit den 674 Datensätzen der Tabelle tblEMails1 zum korrekten Ergebnis 678 führt.

Nun stellt sich dennoch die Frage, warum die UNION-Abfrage nur 675 Datensätze liefert. Ich habe da so einen Verdacht … könnten die beiden Tabellen Duplikate enthalten Auch das können wir leicht prüfen. Dazu erstellen wir einfach noch eine weitere Abfrage namens qryEMails1_KeineDuplikate, fügen die Tabelle tblEMails1 hinzu und ziehen das Feld EMail in das Entwurfsraster. Außerdem stellen wir für die Eigenschaft Keine Duplikate der Abfrage den Wert Ja ein (siehe Bild 7).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar