Inhalte von Textdateien vergleichen

Sebi85

Enthusiast
Thread Starter
Mitglied seit
12.07.2005
Beiträge
2.318
Ich habe zwei Textdateien (ca. 35 000 Zeilen), die würde ich gerne vergleichen. Der Vergleich sollte aber nicht Zeilengenau vergleichen.

z. B.
Datei.......1 | Datei.......2
----------- | ---------
Zeile 1: abc | 123 --> Unterschied
Zeile 2: 123 | abc --> Unterschied

Das möchte ich aber NICHT.

Das Programm soll erkennen, dass alle Zeilen von Datei 1 in Datei 2 vorhanden sind, auch wenn sie nicht in der gleichen Zeile stehen.

--> Das Programm soll mir dann sagen, was in Datei 2 zu viel und zu wenig ist.

Kennt jemand so ein Tool? (Am besten Freeware)
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Du nimmst die erste Zeile der Datei, vergleichst diese mit allen Zeilen der zweiten. Dann die zweite Zeile der ersten Datei und vergleichst wieder mit allen. Das wäre das einfachste. Falls diff nicht tut, was du willst.

Edit: vergiss es. Hier geht es ja gar nicht um selbst programmieren, oder?

Wenn du Linux benutzt: head bzw. tail in einem einfachen skript.
 
Zuletzt bearbeitet:
Schau dir mal die Antwort zu der Frage hier an: bash - Deleting lines from one file which are in another file - Stack Overflow. Mach es so:
Code:
grep -v -x -f f2 f1 > f3
Wobei f2 die Datei ist, deren Inhalt in f1 enthalten sein soll. f3 enthält dann alle Zeilen die nicht in f1 gefunden wurden. grep ist ein Unix/Linux tool. Du kannst den port auf Windows hier herunterladen.
1. Nach der Installation öffnest du eine Kommandozeile
2. Gehe in den Ordner wo beide Dateien liegen
3. Führe aus:
Code:
grep -v -x -f ex2.txt ex1.txt > ex3.txt
, wobei du ex2 und ex1 durch die entsprechenden Dateinamen ersetzt.

Viel Spaß
 
@LisTenEr
Das funktioniert leider nicht: grep: Invlid back reference
Ohne das -f geht der Befehl, dann kommt aber nicht das gewünschte raus.

@unl34shed
WinMerge zeigt auch verschobene Blöcke an, leider kann man aber nicht einstellen, dass nur diese angezeigt werden. Daher bringt mir das Programm auch nicht viel.
 
Wie wärs mit selbst programmieren? Ein kleines Tool wäre dazu schnell geschriebn.
Denke aber wenn du so versiert in der Programmierung wärst, würdest du hier nicht fragen? :fresse:

edit:
Notepad++ soll eine derartige "compare"-Funktion besitzen
 
Zuletzt bearbeitet:
Notepad++ soll eine derartige "compare"-Funktion besitzen
Glaube nicht, dass es a) das gewünschte Ergebnis bringen wird und b) 35k Zeilen verkraftet. Dürfte eher einfach abschmieren.

Wie lange sind denn die einzelnen Zeilen maximal ?
Wenn es ~ <250 Zeichen sind, würde ich beide Dateien in eine Datenbank einlesen, Index erstellen lassen und dann einfach "Insert Into datei1zuviel (zeilenr) Select zeilenr From datei1 Where not in datei2"
Wenn die Abfrage für alle Zeilen zu lange Dauert das ganze in Schritten machen, d.h. nur ein paar hundert Zeilen von "datei1" mit "datei2" vergleichen, und dass im Loop durchlaufen lassen, bis es durch ist.
Schätze mal dass es damit in 10 Minuten erledigt wäre.

Wenn die einzelnen Zeilen sehr lang sind dann wohl doch eher mit einem Programm Zeile für Zeile abklappern, wie Murazor es beschrieben hat.
Geht einfach zu Programmieren, braucht aber Schätzungsweise auch sehr lange zum durchlaufen.
 
Zuletzt bearbeitet:
Ich kenne solche Systeme die das können, aber die sind eher im Business-Enterprise Umfeld Zuhause.
Z.B. Documentum oder Gauss VIP - aber die kommen nicht in Frage, für das Geld bekommt man nen neuen 5er BMW mit Vollausstattung.

Freeware würde mich da sehr wundern, aber vielleicht hat ja noch einer einen guten Tip.
 
Natürlich könnte ich sowas programmieren. Aber wenn es eine gute Freeware gibt, muss man das Rad ja nicht neu erfinden. Schneller wie grep wird es auch nicht sein. Mit grep läuft es jetzt, es lag an ein paar Sonderzeichen in der Datei. Allerdings hat jede Datei > 40 000 Zeilen. Nach 2 Stunden habe ich grep abgebrochen, das dauert einfach zu lange.
Notepad++ kommt halbwegs mit klar, stößt aber an seine Grenzen.
 
Das es 2 Stunden dauert bei der Anzahl von Zeilen ist klar. grep nimmt jede Zeile aus der ersten Datei als regex-pattern und geht damit die zweite Datei durch. Bei m Zeilen in Datei 1 und n Zeilen in Datei n, bist du bei n * m Vergleichen. Am Besten wäre es, wenn du ein kleine Programm findest, dass von Datei 1 ein Muster für gültige Zeilen lernt und dieses Muster dann auf die Zeilen in Datei 2 anwendet. Dann kämst du mit m+n aus.
 
@Sebi85

Was für ein OS nutzt du? Unter sämtlichen Linux-Distribution ist ja Python standardmässig installiert. Mit dem Modul difflib kannst du Sequenzen vergleichen. Wäre mit 10 Zeilen Code erledigt...
 
linux bash, ansonst nimm tbb :)

Code:
[mac@alpha cmp-1]$ echo -e "1001\n0110\n1100\n0011\n1000\n1111" >> DATEI-LINKS \
[mac@alpha cmp-1]$ echo -e "0101\n0110\n1100\n0001\n0011\n1000\n1010" >> DATEI-RECHTS \
[mac@alpha cmp-1]$ while read L; do grep -q -- "${L}" DATEI-LINKS; \
if [ "${?}" -eq "0" ]; then echo "B ${L}" >> ERGEBNISS; \
elif [ "${?}" -eq "1" ]; then echo "R ${L}" >> ERGEBNISS; fi; done <DATEI-RECHTS
[mac@alpha cmp-1]$ while read L; do grep -q -- "${L}" DATEI-RECHTS ; \
if [ "${?}" -eq "1" ]; then echo "L ${L}" >> ERGEBNISS; fi; done <DATEI-LINKS \
[mac@alpha cmp-1]$ cat ERGEBNISS \
R 0101
B 0110
B 1100
R 0001
B 0011
B 1000
R 1010
L 1001
L 1111
[mac@alpha cmp-1]$ wc -l *
  6 DATEI-LINKS
  7 DATEI-RECHTS
  9 ERGEBNISS
 22 insgesamt

[mac@alpha cmp]$ time { while read L; do grep -q -- "`echo ${L} | sed -e 's/[]\/()$*.^|[]/\\&/g'`"\
 DATEI-LINKS; if [ "${?}" -eq "0" ]; then echo "B ${L}" >> ERGEBNISS; \
 elif [ "${?}" -eq "1" ]; then echo "R ${L}" >> ERGEBNISS; fi; \
 done <DATEI-RECHTS && while read L; \
 do grep -q -- "`echo ${L} | sed -e 's/[]\/()$*.^|[]/\\&/g'`" DATEI-RECHTS ; \
 if [ "${?}" -eq "1" ]; then echo "L ${L}" >> ERGEBNISS; fi; \
 done <DATEI-LINKS;} && wc -l *

real    8m2.953s
user    4m23.523s
sys     3m7.033s
  18636 DATEI-LINKS
  19537 DATEI-RECHTS
  36481 ERGEBNISS
  74654 insgesamt
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh