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-ID: 40201

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

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

miniversum
miniversum 15.09.2006 um 13:46:03 Uhr
Goto Top
Das einfachste:
fc Text1.txt Text2.txt > Unterschiede.txt

Hilft das?

miniversum
JuliaB
JuliaB 15.09.2006 um 13:50:59 Uhr
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
miniversum
miniversum 15.09.2006 um 14:03:48 Uhr
Goto Top
mit fc /N kannst du dir die Zeilennummern anzeigen lassen.
Vielleicht bringt dich das weiter?

miniversum
JuliaB
JuliaB 15.09.2006 um 14:07:28 Uhr
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
geTuemII
geTuemII 15.09.2006 um 14:18:56 Uhr
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
miniversum
miniversum 15.09.2006 um 14:20:52 Uhr
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
Biber
Biber 21.09.2006 um 20:20:10 Uhr
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
combat
combat 08.10.2008 um 11:36:57 Uhr
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
Biber
Biber 08.10.2008 um 19:24:43 Uhr
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
combat
combat 09.10.2008 um 12:42:03 Uhr
Goto Top
Hi Biber,

danke für deine Hilfe.
Jetzt funktioniert es.

Danke
Gruß combat
juergi69
juergi69 08.01.2009 um 13:06:07 Uhr
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
Biber
Biber 08.01.2009 um 17:38:28 Uhr
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
pmaterina
pmaterina 20.04.2012 um 10:38:33 Uhr
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
Biber
Biber 20.04.2012 um 11:33:31 Uhr
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
pmaterina
pmaterina 20.04.2012 um 11:44:47 Uhr
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
106009
106009 20.04.2012 um 13:55:31 Uhr
Goto Top
Hi,

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

Gruß
Letzify
Letzify 17.02.2015 um 10:18:38 Uhr
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 ;)
Heiß diskutiert
superfun2k24Sophos SFOS 20 DNAT funktioniert nichtsuperfun2k24 - 26 Kommentareuser217Kaufberatung Hardware - Hyper-V Cluster 3 Nodesuser217 - 25 KommentarePharaunIntel-E810 QSFP28 to Mikrotik QSPF+ mit 40Gbit VerbindungPharaun - 24 Kommentareprplemk2Testumgebung bauen (Grundlegend)prplemk2 - 19 KommentareaufdemmarsHP Z620 USB hat kein Strom beim Startenaufdemmars - 17 KommentareTJ.Hooker74Dom.Admin-Passwort ändern - Auswirkungen auf EX, HCW, AADCTJ.Hooker74 - 15 KommentaremaisenkaiserSwitch ohne STP ins Netzwerkmaisenkaiser - 13 KommentareUnluckyProccess1999Creo 4.0 Lizenz Server (LMTOOLS)UnluckyProccess1999 - 13 KommentareJudgelgZertifikate in die Exchange Online GAL hochladenJudgelg - 13 KommentareadmtechEntwicklertagebuch: Release 6.4 - Filteradmtech - 13 KommentareleberkaeseFB7590 ISDN Fax-Funktionleberkaese - 12 KommentareHemingwayWord Makro soll aktuelle Datei regelmäßig kopieren und speichernHemingway - 11 Kommentare