Zwei Textdateien vergleichen und Unterschiede filtern
Hallo ihr Lieben!
ich habe zwei Textdateien vorliegen, die zu unterschiedlichen Zeitpunkten erstellt wurden. In diesen Dateien stehen lauter Verzeichnisnamen. Ich soll nun diese beiden Dateien mittels Batch-Befehlen vergleichen und die Unterschiede der beiden Dateien in eine dritte Datei schreiben.
ich versuche mein Problem mal zu veranschaulichen:
Text1.txt
A
B
C
D
E
F
Text2.txt
A
B
C
D
In der dritten Datei sollte also nur E und F stehen.
Meine Versuche sind bisher alle gescheitert. Ich dachte mir, dass ich das mit zwei geschachtelten For-Schleifen machen kann. Die eine For Schleife geht die eine Datei durch und ruft für jeden Eintrag eine weitere for Schleife auf, die dann die andere Text-Datei vergleicht.
@for /f %%a in (Verzeichnisse_alt.txt) do @call test2.bat %%a
und
@for /f %%b in (Verzeichnisse.txt) do @if (%%b) == (%%1) (goto Ja) ELSE (goto Nein)
:Ja
@echo Vorhanden
:Nein
@echo Nein
Irgendwie gibt mir das aber immer beide Faelle aus.
Gibt es da eventuell einen Weg, wie ich zu meinem Ziel komme? Ich bin da grad ziemlich ratlos
((
Viele Gruesse
die Julia
ich habe zwei Textdateien vorliegen, die zu unterschiedlichen Zeitpunkten erstellt wurden. In diesen Dateien stehen lauter Verzeichnisnamen. Ich soll nun diese beiden Dateien mittels Batch-Befehlen vergleichen und die Unterschiede der beiden Dateien in eine dritte Datei schreiben.
ich versuche mein Problem mal zu veranschaulichen:
Text1.txt
A
B
C
D
E
F
Text2.txt
A
B
C
D
In der dritten Datei sollte also nur E und F stehen.
Meine Versuche sind bisher alle gescheitert. Ich dachte mir, dass ich das mit zwei geschachtelten For-Schleifen machen kann. Die eine For Schleife geht die eine Datei durch und ruft für jeden Eintrag eine weitere for Schleife auf, die dann die andere Text-Datei vergleicht.
@for /f %%a in (Verzeichnisse_alt.txt) do @call test2.bat %%a
und
@for /f %%b in (Verzeichnisse.txt) do @if (%%b) == (%%1) (goto Ja) ELSE (goto Nein)
:Ja
@echo Vorhanden
:Nein
@echo Nein
Irgendwie gibt mir das aber immer beide Faelle aus.
Gibt es da eventuell einen Weg, wie ich zu meinem Ziel komme? Ich bin da grad ziemlich ratlos
Viele Gruesse
die Julia
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 40201
Url: https://administrator.de/forum/zwei-textdateien-vergleichen-und-unterschiede-filtern-40201.html
Ausgedruckt am: 12.07.2025 um 20:07 Uhr
17 Kommentare
Neuester Kommentar
Hallo Julia,
wenn es auch was vorgefertigtes sein darf, empfehle ich UltraEdit: UltraEdit32 Beschreibung und Testversion
Die darin enthaltete abgespeckte UlraCompare (blaues rundes Icon in der Leiste) sollte für deine Zwecke völlig ausreichend sein.
geTuemII
wenn es auch was vorgefertigtes sein darf, empfehle ich UltraEdit: UltraEdit32 Beschreibung und Testversion
Die darin enthaltete abgespeckte UlraCompare (blaues rundes Icon in der Leiste) sollte für deine Zwecke völlig ausreichend sein.
geTuemII
Moin Julia,
ich würde da nicht gleich mit so großen Kanonen auf den kleinen Spatz schießen....
Am CMD-Prompt:
Diese Variante bringt alle "Zeilen", also bei Dir Ordnernamen oder Dateinamen, die es auch in verzeichnisse_alt.txt gibt.
Andersrum:
Diese Variante bringt alle Ordnernamen oder Dateinamen, die es NICHT in verzeichnisse_alt.txt gibt.
Genau genommen brauchst Di ja auch nur ein "Verzeichnisse_alt.txt".. das aktuelle Verzeichnis hast Du ja ohnehin..
Was brauchst Du denn noch für Kombinationen?
Gruß
Biber
ich würde da nicht gleich mit so großen Kanonen auf den kleinen Spatz schießen....
Am CMD-Prompt:
>for /f "delims=" %i in (verzeichnisse.txt) do @Findstr "%i" verzeichnisse_alt.txt >nul && @echo %i
Andersrum:
>for /f "delims=" %i in (verzeichnisse.txt) do @Findstr "%i" verzeichnisse_alt.txt >nul || @echo %i
Genau genommen brauchst Di ja auch nur ein "Verzeichnisse_alt.txt".. das aktuelle Verzeichnis hast Du ja ohnehin..
>for /f "delims=" %i in ('dir /b /a:d ') do @Findstr "%i" verzeichnisse_alt.txt >nul || @echo %i
Was brauchst Du denn noch für Kombinationen?
Gruß
Biber
Hallo Biber,
ich habe das gleiche Problem wie zuvor beschrieben, nur kommen ich mit deiner Lösung nicht ganz zurecht.
Wenn ich die zweite Variante verwende:
for /f "delims=" %i in (c:\Protokolle\verzeichnisse.txt) do @findstr "%i" c:\Protokolle\verzeichnisse_alt.txt >nul || @echo %i
dann zeigt er den Inhalt von c:\Protokolle\verzeichnisse.txt:
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
c:\test\verz2\Bild3.JPG
Inhalt von c:\Protokolle\verzeichnisse.txt:
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
c:\test\verz2\Bild3.JPG
Inhalt von c:\Protokolle\verzeichnisse_alt.txt :
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
was mache ich falsch?
Gruß combat
ich habe das gleiche Problem wie zuvor beschrieben, nur kommen ich mit deiner Lösung nicht ganz zurecht.
Wenn ich die zweite Variante verwende:
for /f "delims=" %i in (c:\Protokolle\verzeichnisse.txt) do @findstr "%i" c:\Protokolle\verzeichnisse_alt.txt >nul || @echo %i
dann zeigt er den Inhalt von c:\Protokolle\verzeichnisse.txt:
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
c:\test\verz2\Bild3.JPG
Inhalt von c:\Protokolle\verzeichnisse.txt:
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
c:\test\verz2\Bild3.JPG
Inhalt von c:\Protokolle\verzeichnisse_alt.txt :
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
was mache ich falsch?
Gruß combat
Moin combat,
ergänze bitte noch den FindStr-Parameter /C: , dann sollte es besser laufen.
Grüße
Biber
ergänze bitte noch den FindStr-Parameter /C: , dann sollte es besser laufen.
(=19:22:19 E:\Schnipsel=)
## in verzeichnisse.txt, nicht in Verzeichnisse_alt.txt
>for /f "delims=" %i in (verzeichnisse.txt) do @findstr /i /C:"%i" verzeichnisse_alt.txt>nul || @echo %i
c:\test\verz2\Bild3.JPG
## in verzeichnisse.txt UND auch in Verzeichnisse_alt.txt
(=19:22:34 E:\Schnipsel=)
>for /f "delims=" %i in (verzeichnisse.txt) do @findstr /i /C:"%i" verzeichnisse_alt.txt>nul && @echo %i
c:\test\Bild3.JPG
c:\test\verz1\bild1.JPG
c:\test\verz2\Bild2.JPG
Grüße
Biber
Moin juergi69,
so'n Drömelkrams kannst Du direkt vom CMD-Prompt aus abpfriemeln:
[Einzugebende Zeilen beginnen mit ">"; Demo mit Deinen Dateien A.txt und B.txt im Verzeichnis e:\work]
Hilfe unter FindStr /? am CMD-Prompt oder 0900 4711 4711 für 86 Eur/Min
Grüße
Biber
so'n Drömelkrams kannst Du direkt vom CMD-Prompt aus abpfriemeln:
[Einzugebende Zeilen beginnen mit ">"; Demo mit Deinen Dateien A.txt und B.txt im Verzeichnis e:\work]
E:\Work>
>findstr /v /g:b.txt a.txt & findstr /v /g:a.txt b.txt
a
b
f
E:\Work>
>(findstr /v /g:b.txt a.txt & findstr /v /g:a.txt b.txt) >ergebnis.txt
E:\Work>
>type ergebnis.txt
a
b
f
Hilfe unter FindStr /? am CMD-Prompt oder 0900 4711 4711 für 86 Eur/Min
Grüße
Biber
Gude,
bin neu im Forum und muss gleih einmal einen alten Post rauskramen
die von Biber angegeben Zeile
funktioniert soweit auch-schonmal Danke dafür-, jedoch nicht so, wie ich es mir vorgestellt habe:
wenn ich in 1.txt folgende Informationen habe:
00001
002
00003
und in 2.txt:
00001
00002
00003
und mir die "Unterschiede in 3.txt augeben lasse,
gibt es keine!
Ist mir auch soweit einleuchtend...
Kennt jemand eine möglichkeit, womit man auch diese Eventualitäten berücksichtigen kann?!
MfG
pm
bin neu im Forum und muss gleih einmal einen alten Post rauskramen
die von Biber angegeben Zeile
for /f "delims=" %i in (verzeichnisse.txt) do @findstr "%i" verzeichnisse_alt.txt >nul || @echo %i
funktioniert soweit auch-schonmal Danke dafür-, jedoch nicht so, wie ich es mir vorgestellt habe:
wenn ich in 1.txt folgende Informationen habe:
00001
002
00003
und in 2.txt:
00001
00002
00003
und mir die "Unterschiede in 3.txt augeben lasse,
gibt es keine!
Ist mir auch soweit einleuchtend...
Kennt jemand eine möglichkeit, womit man auch diese Eventualitäten berücksichtigen kann?!
MfG
pm
Moin pmaterina,
willkommen im Forum.
Wenn du eine exakte Überstimmung überprüfen willst, so ist bei FindStr.exe der Parameter "/C:" dafür vorgesehen.
Oder auch der Paramter /X, mit dem du ganze Zeilen vergleichen kannst.
Beispiel am CMD-prompt:
Also ergänze einfach den Parameter /X in dem oben zitierten Oneliner.
Grüße
Biber
willkommen im Forum.
Wenn du eine exakte Überstimmung überprüfen willst, so ist bei FindStr.exe der Parameter "/C:" dafür vorgesehen.
Oder auch der Paramter /X, mit dem du ganze Zeilen vergleichen kannst.
Beispiel am CMD-prompt:
d;\temp>Type Datei?.txt
DateiA.txt
00001
002
00003
dateiB.txt
00001
00002
00003
d:\temp>findstr /v /x /g:Dateib.txt Dateia.txt
002
d:\temp>findstr /v /x /g:Dateia.txt Dateib.txt
00002
Also ergänze einfach den Parameter /X in dem oben zitierten Oneliner.
Grüße
Biber
Hi Biber,
hätte ich mal findstr/? genauer gelesen.... @^-^@
alleine mit dem Parameter /C funktioniert es so nicht,
da 002 in 2.txt gefunden wird, genauer in 00002 gefunden wird
aber in kombination mit /x und /c läuft´s einwandfrei (als .bat ausgeführt):
for /f "delims=" %%a in (1.txt) do @findstr /i /X /C:"%%a" 2.txt || @echo %%a>>3.txt
3.txt:
002
Vielen Dank für die schnelle Hilfe!
MfG
pm
hätte ich mal findstr/? genauer gelesen.... @^-^@
alleine mit dem Parameter /C funktioniert es so nicht,
da 002 in 2.txt gefunden wird, genauer in 00002 gefunden wird
aber in kombination mit /x und /c läuft´s einwandfrei (als .bat ausgeführt):
for /f "delims=" %%a in (1.txt) do @findstr /i /X /C:"%%a" 2.txt || @echo %%a>>3.txt
3.txt:
002
Vielen Dank für die schnelle Hilfe!
MfG
pm

Hi,
zeilenweises Vergleichen kann mit dem Konsolentool comp, binären Vergleich mit fc durchühren.
Gruß
zeilenweises Vergleichen kann mit dem Konsolentool comp, binären Vergleich mit fc durchühren.
Gruß
Hallo Biber,
eine ähnliche Lösung habe ich für meine Zwecke auch gefunden - allerdings habe ich bei deiner - wie auch bei meiner Lösung - das Problem, dass mir die Datei, die hinterher entsteht auch die Zeilen "Verzeichnis von" ausgibt, obwohl sich diese Zeile im Vergleich zur Quelldatei gar nicht geändert haben.
Die Verzeichnislisten, die ich damit überprüfe haben 20.000 Verzeichnisse und 26.000 Dateien. Ich hatte jetzt zwei Ideen, wie ich es trotzdem noch hinbekomme diesen Umstand zu nutzen, allerdings keinen Ansatz, wie ich das hinbekommen soll. Jegliche Versuche scheiterten.
1) die Zeile "Verzeichnis von" in einer Variablen puffern und zusammen mit der geänderten Datei hinterher in eine Zeile schreiben (allerdings nur die Datei, nicht das Änderungsdatum, die Uhrzeit, die Art und Größe etc, also im Prinzip nur Spalte 5).
Beispiel alt:
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\...
17.02.2015 09:34 4.252.754 datei.txt
Beispiel neu:
\\Server\Verzeichnis\U-Verzeichnis\...\datei.txt
2) Alle Zeilen aus der Zieldatei löschen zu lassen, wo nach einer "Verzeichnis von"-Zeile eine weitere folgt, also folglich keine Änderung in diesem Verzeichnis erfolgt ist.
Beispiel alt:
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\UU-Verzeichnis\
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\UU-Verzeichnis\UUU-Verzeichnis
Beispiel neu:
(die beiden ersten Zeilen wurden gelöscht, da nachfolgend keine Änderungen vorgenommen wurden)
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\UU-Verzeichnis\UUU-Verzeichnis
Bei beiden sitze ich nun schon seit 3-4 Tagen dran und bekomme es mit den Bordmitteln einfach nicht hin.
Ich hoffe du kannst mir weiterhelfen, da ich langsam wahnsinnig werde ;)
eine ähnliche Lösung habe ich für meine Zwecke auch gefunden - allerdings habe ich bei deiner - wie auch bei meiner Lösung - das Problem, dass mir die Datei, die hinterher entsteht auch die Zeilen "Verzeichnis von" ausgibt, obwohl sich diese Zeile im Vergleich zur Quelldatei gar nicht geändert haben.
Die Verzeichnislisten, die ich damit überprüfe haben 20.000 Verzeichnisse und 26.000 Dateien. Ich hatte jetzt zwei Ideen, wie ich es trotzdem noch hinbekomme diesen Umstand zu nutzen, allerdings keinen Ansatz, wie ich das hinbekommen soll. Jegliche Versuche scheiterten.
1) die Zeile "Verzeichnis von" in einer Variablen puffern und zusammen mit der geänderten Datei hinterher in eine Zeile schreiben (allerdings nur die Datei, nicht das Änderungsdatum, die Uhrzeit, die Art und Größe etc, also im Prinzip nur Spalte 5).
Beispiel alt:
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\...
17.02.2015 09:34 4.252.754 datei.txt
Beispiel neu:
\\Server\Verzeichnis\U-Verzeichnis\...\datei.txt
2) Alle Zeilen aus der Zieldatei löschen zu lassen, wo nach einer "Verzeichnis von"-Zeile eine weitere folgt, also folglich keine Änderung in diesem Verzeichnis erfolgt ist.
Beispiel alt:
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\UU-Verzeichnis\
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\UU-Verzeichnis\UUU-Verzeichnis
Beispiel neu:
(die beiden ersten Zeilen wurden gelöscht, da nachfolgend keine Änderungen vorgenommen wurden)
Verzeichnis von \\Server\Verzeichnis\U-Verzeichnis\UU-Verzeichnis\UUU-Verzeichnis
Bei beiden sitze ich nun schon seit 3-4 Tagen dran und bekomme es mit den Bordmitteln einfach nicht hin.
Ich hoffe du kannst mir weiterhelfen, da ich langsam wahnsinnig werde ;)