juliab
Goto Top

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 ratlosface-sad((

Viele Gruesse
die Julia

Content-Key: 40201

Url: https://administrator.de/contentid/40201

Printed on: April 23, 2024 at 22:04 o'clock

Member: miniversum
miniversum Sep 15, 2006 at 11:46:03 (UTC)
Goto Top
Das einfachste:
fc Text1.txt Text2.txt > Unterschiede.txt

Hilft das?

miniversum
Member: JuliaB
JuliaB Sep 15, 2006 at 11:50:59 (UTC)
Goto Top
Hallo miniversum,

vielen Dank fuer deine Antwort, aber leider bringt mich das nicht weiter, da ich nur die Zeilen brauche und nicht die genauen Veränderungen.

Liebe Gruesse
die Julia
Member: miniversum
miniversum Sep 15, 2006 at 12:03:48 (UTC)
Goto Top
mit fc /N kannst du dir die Zeilennummern anzeigen lassen.
Vielleicht bringt dich das weiter?

miniversum
Member: JuliaB
JuliaB Sep 15, 2006 at 12:07:28 (UTC)
Goto Top
Hey du,

leider nicht.
Ich braeuchte in Unterschied.txt einfach einen Eintrag wie:

E
F

und nicht wie bei fc:


* Text1.txt
1: A
2: B
3: C
* Text2.txt
1: A
2: B
*
usw...

Sorry, das hilft mir leider nicht wirklich weiterface-sad

Aber danke fuer deine Bemühungen!


Liebe Gruesse
die Julia
Member: geTuemII
geTuemII Sep 15, 2006 at 12:18:56 (UTC)
Goto Top
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
Member: miniversum
miniversum Sep 15, 2006 at 12:20:52 (UTC)
Goto Top
Also zu deinem Ansatz:
beim
:Ja
@echo Vorhanden
würd ich noch ein goto eof dranhängen, da sonst das Skript weiter läuft und den :Nein Fall reinläuft. Daher die beiden Ausgaben bei dir.
Also:

:Ja
@echo Vorhanden
goto eof

:Nein
@echo Nein

miniversum
Member: Biber
Biber Sep 21, 2006 at 18:20:10 (UTC)
Goto Top
Moin Julia,
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  
Diese Variante bringt alle "Zeilen", also bei Dir Ordnernamen oder Dateinamen, die es auch in verzeichnisse_alt.txt gibt.

Andersrum:
>for /f "delims=" %i in (verzeichnisse.txt) do @Findstr "%i" verzeichnisse_alt.txt >nul || @echo %i  
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..
>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
Member: combat
combat Oct 08, 2008 at 09:36:57 (UTC)
Goto Top
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:


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
Member: Biber
Biber Oct 08, 2008 at 17:24:43 (UTC)
Goto Top
Moin combat,

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
Member: combat
combat Oct 09, 2008 at 10:42:03 (UTC)
Goto Top
Hi Biber,

danke für deine Hilfe.
Jetzt funktioniert es.

Danke
Gruß combat
Member: juergi69
juergi69 Jan 08, 2009 at 12:06:07 (UTC)
Goto Top
Hallo Biber,
ich würde auch nur den Unterschied zw. zwei Dateien brauchen.

A.txt
a
b
c
d
e

B.txt
c
d
e
f

ergebnis.txt
a
b
f

vielleicht hast Du eine Lösung

lg
Jürgen
Member: Biber
Biber Jan 08, 2009 at 16:38:28 (UTC)
Goto Top
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]
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
Member: pmaterina
pmaterina Apr 20, 2012 at 08:38:33 (UTC)
Goto Top
Gude,

bin neu im Forum und muss gleih einmal einen alten Post rauskramen face-wink

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
Member: Biber
Biber Apr 20, 2012 at 09:33:31 (UTC)
Goto Top
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:
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
Member: pmaterina
pmaterina Apr 20, 2012 at 09:44:47 (UTC)
Goto Top
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):


3.txt:
002

Vielen Dank für die schnelle Hilfe!

MfG
pm
Mitglied: 106009
106009 Apr 20, 2012 at 11:55:31 (UTC)
Goto Top
Hi,

zeilenweises Vergleichen kann mit dem Konsolentool comp, binären Vergleich mit fc durchühren.

Gruß
Member: Letzify
Letzify Feb 17, 2015 at 09:18:38 (UTC)
Goto Top
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 ;)
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 5 CommentsjstrickerWireguard VPN on UDM Pro behind Fritzbox - Handshake did not completejstricker - 3 CommentsAlexWishaHow to set up and configure a Linux GRE tunnelAlexWisha - 3 Comments