[Excel] Duplikate in SEHR großen Dateien finden

SaxnPaule

Admiral
Registriert
Okt. 2010
Beiträge
8.971
Hallo Community,

leider habe ich bisher keine Lösung gefunden, die mir weiterhilft.

Ich habe eine CSV mit sehr vielen Zeilen (400k+) die ich mit Excel öffne um doppelte Zeilen (auf Basis von 3 Spalten) zu finden.
Das Vorgehen an sich ist klar. Helferspalte mit den konkatinierten Werten aus den drei Spalten und darauf dann in einer weiteren Spalte ein COUNTIFS(...)>1. Diese dann auf true/false filtern.

Bis zum Erstellen der COUNTIFS Spalte geht noch alles in halbwegs erträglichem Tempo (5 Min warten). Danach ist aber Ende. Nichtmal speichern kann ich mehr. Sanduhr, 100% CPU Load, Föngeräusch, .....

Gibt es eine andere, handliche Möglichkeit die Dupletten zu finden (nicht löschen!)?


Bin drauf und dran mir was zu programmieren, hoffe aber es gibt einen einfacheren Weg.
 
Ich hatte ein ähnliches Problem, geholfen hat ein Update aus die aktuell 64 Bit Version und ein Rechner mit genug Arbeitsspeicher.
 
hast u es schon mal mit einem einfachen FIlter versucht?

bedingte Formatierung auf deine gesamte SPalte, in der die Duplikate vorkommen, doppelte Werte markieren lassen und anschließend nach Farbe filtern.
 
@SpamBot habe bereits die 64bit Version und 32GB Ram.

@spcqike Das war mein erster Ansatz. Das farblich hervorheben der konkatinierten Helferspalte funktioniert auch. Aber beim Dropdown klicken um an die Filterfunktion zu gelangen ists vorbei.
 
SaxnPaule schrieb:
Gibt es eine andere, handliche Möglichkeit die Dupletten zu finden (nicht löschen!)?
Import in ein Datenbanksystem deiner Wahl und dann dort mit entsprechender Abfrage die Duplikate ausgeben lassen.

Wenn das regelmäßig gemacht werden soll, könnte man den Prozess dann bestimmt auch automatisieren.
 
  • Gefällt mir
Reaktionen: nkler und scooter010
Nach den 3 Spalten sortieren.
Eine extra Spalte machen, die angibt, ob die 3 Werte in der aktuellen Zeile und der vorigen
Zeile gleich sind.
Dann nach der extra Spalte filtern.
 
@umask007 @duAffentier Das habe ich doch bereits probiert. Funktioniert aufgrund der Größe aber nicht.

@Cave Johnson Auch das habe ich bereits probiert. Selbes Ergebnis.


Ich habe es mir ganz quick&dirty zusammengehackt. Hier der Snip, falls jemand mal vor der gleichen Herausforderung steht. Laufzeit für 439.124 Zeilen beträgt 811ms 🤣
Drei Duplikate gefunden.

Java:
import java.io.File;
import java.util.*;

public class DuplicateKeyFinder {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        try {
            File myObj = new File("mycsv.csv");
            Scanner myReader = new Scanner(myObj);

            HashSet<String> lines = new HashSet<>();
            List<String> duplicates = new ArrayList<>();
            int lineNumber = 1;

            while (myReader.hasNextLine()) {
                lineNumber++;
                String data = myReader.nextLine();
                List<String> cols = Arrays.asList(data.split(";"));

                // Key columns
                String value = cols.get(0) + cols.get(1) + cols.get(2);

                if (!lines.add(value)) {
                    duplicates.add(lineNumber + " - " + value);
                }

                if(lineNumber%1000 == 0) {
                    System.out.println("Processed " + lineNumber/1000 + ".000 lines...");
                }
            }

            for (String dupLine : duplicates) {
                System.out.println(dupLine);
            }

            myReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Processing took " + (System.currentTimeMillis()-start) + "ms.");
    }

}


Code:
....
Processed 435.000 lines...
Processed 436.000 lines...
Processed 437.000 lines...
Processed 438.000 lines...
Processed 439.000 lines...
17 - "01568815""2""de"
45 - "01568828""1""de"
63 - "01568858""2""de"
Processing took 811ms.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: spcqike und kartoffelpü
SaxnPaule schrieb:
@umask007 @duAffentier Das habe ich doch bereits probiert. Funktioniert audfgrund der Größe aber nicht.
Du verwendest countif. Also bei jedem Countif in jeder Zeile werden die kompletten 400k Zeilen durchlaufen. Oder um es mal in der Big O Notation auszudrücken O(n^2).
Meine Lösung kommt ohne countif aus.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Snooty, duAffentier und SaxnPaule
Zurück
Oben