Calc: Zeilen-Duplikate (doppelte Datensätze) finden und entfernen

Moin.

Ich habe eine umfangreiche dreispaltige Tabelle mit Logins und bin dabei sie zu normalisieren.

LO 24.8.1.2 auf macOS.

Dazu gehört auch das Finden und Entfernen von Zeilen, die in allen Werten übereinstimmen, also von Zeilen-Duplikaten, von doppelten Datensätzen).

Für das Finden verwende ich:

1 Vierte Hilfspalte rechts von den drei Spalten erzeugen
2 Formel: =TEXTKETTE(A2;" | “;B2;” | ";C2)
3 Formel runterkopieren bis zum Ende der Tabelle
4 Hilfspalte markieren
5 Bedingte Formatierung für die Hilfsspalte:
Zellwert; ist mehrmals vorhanden
Vorlage anwenden: Warnung
Bereich: Hier wird automatisch die Spalte D angezeigt, weil sie zuvor markiert wurde
6 OK

Problem:
Die verschiedenen Duplikate stehen getrennt voneinander.
Das könnte man beheben, indem man die Datensätze der Hilfsspalte nach sortieren lässt.

Aber dann hat man noch keine Möglichkeit, nach der manuellen Sichtkontrolle, alle Duplikate in einem Rutsch zu löschen.

Es gibt zum reinen Entfernen noch diese Erweiterung:

Wenn ich sie auf mehrere Spalten anwende, erhalte ich reproduzierbar die Meldung “Finished in 0 seconds.
Not finished! The changes will now be undone.”

Für eine einzelne Spalte funktioniert sie, entfernt jedoch ohne eine Kontrolle zu erlauben.

Ich habe das Entfernen jetzt über einen Filter gelöst:

Zusammengefasst:
Gibt es eine leichter und schneller anwendbare Lösung für die nicht so seltene Aufgabe “Doppelte Datensätze entfernen”?

Ich würde mich freuen. Danke.

Gruß, Andreas

In den Neuerungen für Version 24.8. könnte was für dich dabei sein.

https://wiki.documentfoundation.org/ReleaseNotes/24.8/de#Calc

Ich habe jetzt die Release Notes zu Calc gelesen, konnte aber nichts Passendes finden. Was meintest Du bitte?

Ich meinte die neuen Calc Funktionen:

Hätte ja sein können, dass dir eine davon irgendwie nutzt.

1 Like

Das Ganze ist in einer Datenbank simpel. Deswegen: Kopiere die Tabelle in eine Datenbank, lass die Datensätze als eindeutige Datensätze anzeigen, kopiere das Ergebnis zurück.

Danke.

Vielleicht lässt sich “EINZIGARTIG” verwenden?
Ich muss dazu Beispiel und Doku noch suchen.

Insgesamt ist die Aufgabe wohl doch so komplex, dass es wohl eine Erweiterung braucht, damit normale Nutzer die Aufgabe lösen können.
Das mehrstufige Verfahren mit Hilfspalten, Formel, Sortieren, Bedingter Formatierung und Datenfilter ist schon sehr aufwändig.

Ich habe das Gerade mit “Einzigartig” probiert: =EINZIGARTIG($A$1:$B$8) ergibt, in C1 eingegeben, aus dem Bereich A1 bis B8 eindeutige Datensätze im Bereich C1 bis D5. 3 Datensätze fallen raus, weil sie doppelt waren.

Hallo

⇒ Daten ⇒ Weitere Filter ⇒ Standardfilter:

mit den Optionen:
[x]keine Duplikate
[x]Ergebnisse kopieren nach …(woanders)

tut doch genau was du willst, ohne extra Formeln und über mehrere Spalten hinweg??

1 Like

Wie schon erwähnt, würde das Problem mit einer Datenbank zum einen leicht zu lösen sein, und zum anderen kann man eine Datenbank so einrichten, dass sie sich weigert, Duplikate überhaupt zu speichern. Die allermeisten Nutzer von Tabellenkalkulationen versuchen extrem hartnäckig, dieses Instrument für etwas zu verwenden, wofür es ursprünglich gar nicht erfunden wurde. Für schnelle ad-hoc Zusammenstellungen von Datensätzen aus der Zwischenablage ist eine Tabellenkalkulation recht gut zu gebrauchen. Nach ein paar Monaten mit tausenden Datensätzen und dutzenden verschiedenen Formeln, Verweisen, Gültigkeitsprüfungen wird das ganze zu einem unkontrollierbaren Flohzirkus.

@RobertG
Danke für den Bericht. Konnte ich mittlerweile auch ausprobieren. Funktioniert prima. Eine schöne Bereicherung, diese Funktion. Sie macht exaxt dasselbe wie der Filter aus dem Screenshot im Ausgangsposting.

@Villeroy
Du rennst bei mir offene Türen zu Datenbanken ein. Würde ich dauerhaft im besprochenen Fall Datensätze nutzen wollen, würde ich selbstverständlich ein Datenbanktool verwenden und nicht Calc.
Aber hier geht es, ich erwähnte es im Ausgangsposting, um etwas Temporäres, um Normalisierung. Danach werden die Datensätze in einen Passwortmanager transferiert.

Ich wundere mich, dass ich hier mit meinem kleinen Vorschlag direkt in Calc doppelte Datensätze zu ermitteln und zu löschen auf Unverständnis und Gegenwehr stoße.

Ich bin mir dennoch weiterhin sicher, dass ein einfacher Befehl wie “Menü Daten > Duplikat-Zeilen ermitteln” für viele Nutzer praktisch wäre.

Wichtig wäre eben eine Option, die gefundenen markiert dargestellten Duplikate einzeln oder in einem Rutsch löschen zu können.

Aber lassen wir das Thema. Es ist alles gesagt. So einen Befehl oder Erweiterung gibt es nicht. Punkt.

Ja, für temporäre Ad-Hoc-Tabellen ist eine Tabellenkalkulation prima, und @karolus hat die meist praktikable Antwort gegeben. Wenn Dir die paar Klicks zu umständlich sind, dann deutet das eher darauf hin, dass es sich eben nicht um eine temporäre Ad-Hoc-Tabelle handelt.
Es wäre auch möglich, ein Base-Dokument mit einem Calc-Dokument zu verbinden und eine Abfrage zu verwenden wie SELECT DISTINCT "A","B","C" FROM "Tabelle1".
Diese Abfrage gibt dann die eindeutigen Datensätze zurück. Man kann diese Abfrage auch mit einem Bereich in Calc verknüpfen, aber das macht praktsch niemand. Man installiert dann lieber Excel und hantiert mit grauenhaften Matrixformeln herum.

Sehe ich anders. Wir lassen unseren Dissenz so stehen.

Nur soviel noch: Wenn wir Deiner Logik folgen, kann mehr als die Hälfte der Calc-Funktionalität entfernt werden, weil diese Teile besser mit Base geht.

85976 – [RFE] Add a "remove duplicate records" command sieht aber so aus, als ob da etwas kommt. Es müsste morgen im Daily-Build sein. Vielleicht mal ausprobieren, ob es das macht was der Titel verspricht?

Das nenne ich »dreiste Lüge«!

@Regina
Das klingt sehr vielversprechend. Vielen Dank für den Hinweis.

In Google Sheets existiert übrigens ein klar benannter und leicht nutzbarer Befehl:
“Menü Daten > Datenbereinigung > Duplikate entfernen”
Funktioniert perfekt.
Eine Option, die gefundenen Treffer vorher anzuschauen, gibt es nicht.

Ich finde die Usability von Google Sheets oft sehr hoch entwickelt. Meiner bescheidenen Sicht, kann sich das Projekt Libreoffice dort gute Anregungen holen. Ich möchte mit so einem Satz hier niemanden auf die Füße treten. Im Gegenteil, es ist ganz freundlich und konstruktiv gemeint. Ich verwende LO seit 21 Jahren mit Freude, empfehle es stets weiter und helfe anderen bei der Bedienung. Sowohl im privaten als auch im beruflichen Umfeld.

@karolus
Dann kläre mich doch bitte auf. Bitte denke dabei an die zweiteilige Aufgabe: “erkennen” UND “entfernen”.
Ich fände es angenehm, wenn wir hier einen freundlichen Umgang beibehalten. Das Verwenden des Kampfbegriffs “dreiste Lüge” ist unschön.

1 Like

Das, was Du als “Hälfte” bezeichnest ist ein aufgepfropfter kleiner Bruchteil unter dem Menü “Daten”. Diese Funktionalität setzt voraus, dass deine Daten “normalisiert” sind, also wie eine Datenbanktabelle strukturiert. Datenbankoperationen sind ein aufgepfropfter Zusatz weil, sie mit der Kernfunktionalität gar nichts zu tun haben.
Bei Tabellenkalkulation geht es um freies Verteilen von Kalkulationsmodellen auf einem leeren Gitter. Alles ist eine Zahl. Wenn es nicht als Zahl interpretiert wird, dann ist es Text. Fast alle Funktionen verarbeiten Zahlen. Variablen werden mit absoluten und relativen Bezügen referenziert. Textfunktionen sind rudimentär vorhanden. Selbst Datumswerte und Zeiten sind keine eigenständigen Datentypen sondern durchnummerierte Tage. Eine Tabellenkalkulation kennt noch nicht einmal Tabellen, sondern nur rechteckige Zellbereiche, die vom Endanwender so angelegt sind, dass sie im günstigsten Fall wie eine Datenbanktabelle funktionieren, so dass man sortieren, filtern und nachschlagen kann. Apropos “nachschlagen”: Die Verweis-Funktionen tun standardmäßig überhaupt nicht das, was die meisten Anwender annehmen. Standardmäßig sind sie darauf ausgelegt, einen Wert in einer aufsteigend sortierten numerischen Skala nachzuschlagen. Sehr viele Anwender versuchen z.B. mit VERWEIS einen exakten Text nachzuschlagen, was VERWEIS nur in einem sehr abstrakten Sinne vermag und zu unerwarteten Ergebnissen führt.
Eine Formel zu erstellen, die aus einem Datensatz einen neuen Datensatz zurückgibt (z.B. ohne Duplikate) ist mittels Matrixfunktionen wahrscheinlich möglich (ich weiß nicht wie), aber dafür musst Du die Anwendung schon sehr weit dehnen. Die einzige vorgegebene Funktionalität, die das bisher ermöglichte ware die Pivot-Tabelle, und auch die wird von Anwendern nur sehr ungern benutzt weil sie sich “irgendwie komisch” anfühlt. Sie hat ja auch mit Tabellenkalkulation rein gar nichts zu tun.
90% aller Anwender bemühen sich redlich, mit 10% der vorhandenen Funktionalität eine Datenbankanwendung abzubilden. Die Intelligenteren beginnen irgendwann mit Makro-Programmierung, um ihre persönliche Insellösung zu basteln. Die wirklich Schlauen suchen sich eine geeignete Software für ihren kaufmännischen oder wissenschaftlichen Bereich.

1 Like

data_source.ods (26.8 KB)
SheetDB.odb (2.4 KB)

Und hier eine Lösung, die einer integrierten Office-Suite würdig wäre (ohne Makros):

  • Lege beide Dateien im selben Verzeichnis ab, rufe Extras>Optionen>Base>Datenbanken auf und registriere die Datenbank-Datei unter dem Namen “SheetDB”.
  • Ignoriere vorerst die Datenbankdatei und öffne das Calc-Dokument.
    Auf dem ersten Tabellenblatt “DUPES” ist ein Datenbankbereich, ein paar Zeilen Dokumentation und triviale Formeln. Die letzten 4 Datensätze sind Duplikate. Die rote Linie markiert die erste Zeile unterhalb des Datenbankbereichs. Ich habe die Tabelle von den anderen Inhalten abgegrenzt, indem ich einen Datenbankbereich “Data” definiert habe (siehe Daten->Bereich festlegen…)
    Auf dem zweiten Blatt “NO_DUPES” ist ein Datenbankbereich “Import1”, ein paar Zeilen Dokumentation und Formeln. Dieser Datenbankbereich ist mit einer Datenbankabfrage verknüpft und liefert den Inhalt der ersten Tabelle ohne Duplikate und absteigend nach Datum sortiert.
  • Editiere die erste Tabelle, speichere das Dokument, klicke irgendeine Zelle in “Import1” und Daten->Bereich aktualisieren… Wenn sich dabei die Größe des Datenbankbereiches ändert weil mehr oder weniger Duplikate im Quellbereich sind, wird auch die Größe der angrenzenden Formelspalte “Diff” mit angepasst.

Der folgende Makro-Code würde das weiter automatisieren, z.B. beim Aktivieren des Blattes:
ThisComponent.DatabaseRanges.getByName("Import1").refresh().

Warum hast Du das Datenbankdokument registriert?

  • Drücke Strg+Umsch+F4 für das Datenquellenfenster. Dort findest Du das registrierte Dokument mit seinen Tabellen und Abfragen. Diese Daten stehen für alle Writer- und Calc-Dokumente zur Verfügung. Ich habe hier einfach nur das Icon der Abfrage “No Dupes” auf das zweite Tabellenblatt gezogen.
  • Wegen einer Fehlkonfiguration der Standardwerte musste ich dann noch den autmatisch erzeugten Datenbankbereich “Import1” verändern: Daten->Bereich festlegen, Import1 wählen und unter “Optionen” die Optionen “Einfügen und Löschen” und “Formatierung behalten” aktivieren.

So, und nun wenden wir uns dem Datenbankdokument zu:
Es entält kein Formular und keinen Bericht weil das off topic und zu viel Arbeit wäre.
Warum enthält es 4 Tabellen?
“DUPES” und “NO_DUPES” sind autmatisch erzeugt. Hier wird einfach nur der gesamte Blatt-Inhalt als Tabelle interpretiert. Das ergibt keinen Sinn, weil außer Tabellen-Rechtecke alles mögliche auf so einem Blatt sein kann. Diese Tabellen zeigen zusammen mit den eigentlichen Tabellendaten die Formelergebnisse darunter an und die Dokumentationstexte.
Die anderen beiden Tabellen beziehen sich auf die explizit definierten Datenbankbereiche mit Kopfzeile und datenbankählichen Feldern gleichen Typs.
Unter Extras>Tabellenfilter kann man die beiden irrelevanten Tabellen ausblenden.

Abgesehen von den 4 “Tabellen” enthält die Datenbank eine Abfrage. Eine Abfrage ist eine “Formel”, die eine Menge von Datensätzen zurückgibt. Beim Öffnen werden die Datensätze angezeigt, Rechtsklick>Bearbeiten öffnet eine Art Formeleditor, Rechtsklick>SQL-Ansicht öffnet die eigentliche Formel. Sie ist selbsterklärend:
SELECT * FROM "Data" ORDER BY "Datum" DESC
Das * steht für “alle Spalten”, DESC wie descending (absteigend).

Durch das Ziehen dieser Abfrage aus dem Datenquellenfenster in ein Calc-Dokument habe ich also einen verknüpften Datenbankbereich erzeugt, der die Datensätze dieser Abfrage anzeigt. Das Setzen der Extraoption “Zellen einfügen und löschen” sorgt dafür, dass beim Aktualisieren die Größe des Bereichs stets angepasst wird, ohne dass andere Daten überschrieben werden oder im freien Raum hängen bleiben. Diese Option sollte eigentlich gar nicht existieren, sondern grundsätzlich gesetzt sein.

Wichtig zum Verständnis:
Base konvertiert die Tabellenkalkulation nicht in eine Datenbank, sondern versucht, rechteckige Bereiche der Tabellenkalkulation als Sammlung von Datenbanktabellen zu interpretieren. Die Daten bleiben in der Calc-Datei und können auch nur mit einer Tabellenkalkulation bearbeitet werden. Über Bearbeiten->Datenbank>Eigenschaften… legst Du die Verbindung von Calc nach Base fest. Die Datenbankregistrierung ermöglicht Verbindungen von der Base nach Writer und Calc.
Ein Base-Dokument kann mit einer vielzahl von echten Datenbanken verbunden werden. Diese Verbindungen erlauben dann fast alles, was die jeweilige Datenbank hergibt einschließlich Mehrbenutzerbetrieb. Formulare erlauben das gleichzeitige Bearbeiten miteinander verknüpfter Datensätze aus verschiedenen Datenbanktabellen.
Als Sonderfall kann ein Base-Dokument auch über eine eingebettete Datenbank verfügen. Allerdings ist das wirklich nur für Entwürfe und Schulungsdemos wirklich geeignet.

1 Like

@Villeroy
Vielen Dank für den interessanten Einblick und die Beispieldateien.

Mal ganz allgemein eine Frage zu Datenbankmanagementsystemen, wenn Du erlaubst:

Existieren welche, wo man über ein GUI eine selbst erstellte hochwertige Datenbank und dazugehörige Formulare (Eingabe, Abfragen, …) auf einer Webpage veröffentlichen kann ohne Programmcode schreiben zu müssen?

Je nachdem, was “Programmcode” bedeuten soll, würde ich “Nein” antworten, weil SQL ist genauso erforderlich wie die Formelsprache für eine Tabellenkalkulation. Es braucht ein paar ganz grundlegende Konzepte, wie man Information in Daten und umgekehrt verwandelt. Bei einer altmodischen, relationalen Datenbank kann man die Tabellen nicht “freihändig” nach Belieben gestalten. Ansonsten erfordert eine Web-Datenbank viel mehr Konfiguration als Programmierung. Auch diese Aufgabe ist so ganz ohne Kenntnisse von Netzwerk und Prozessen kaum zu bewältigen.
Auch mein kleines Office-Beispiel besteht nur aus Konfiguration und einem simplen SQL statement. Letzteres ließe sich noch im Abfragedesigner zusammenklicken. Der stößt aber sehr schnell an Grenzen. Am Ende schreibt sich gelerntes SQL schneller als man es klicken kann.

Dass SQL dazugehört ist klar. Das meinte ich nicht mit Programmcode.

Gemeint war Code in typischen Webentwicklersprachen wie PHP und JS. Mir geht es darum, ob man bei einer selbst erstellten Datenbank notwendigerweise einen Programmierer bezahlen muss, damit er sie auf eine Website verfügbar macht, inkl. der Eingabe- und Abfrageformulare?
Um eine Analogie zu verwenden: für textuelle und grafische Webinhalte gibt es CMS. Es ist nicht zwingend nötig HTML und CSS zu beherrschen. Mich interessiert, ob es (mittlerweile) vergleichbare Systeme für DB gibt?