dedalus2011
Goto Top

Zwei Textdateien miteinander zeilenweise parallel vergleichen

Ich habe eine Textdatei1, die ich mit einer anderen Textdatei2 vergleichen möchte. Die Zeilen sind in den Dateien gleich angeordnet. Also möchte ich jede Zeile aus Textdatei1 mit den Zeilen aus Textdatei2 parallel vergleichen. Ist die Zeile vorhanden, soll die nicht überschrieben werde Ist sie nicht vorhanden, soll die geschrieben werden. Mit geschachtelten for-schleifen,etwa durch

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Textdatei2%"')   
do (for /f "tokens=1* delims=:" %%j in ('findstr /n "^" "%Textdatei1%"') do set "Zeile=%%j" && echo %%i && call :Line)   

geht nicht, da die Indexes von den zwei for schleifen nicht parallel verarbeitet werden können. Gibt's da Workarounds? Ideen?

Also so ungefähr:

Textdatei2.txt:

1. String_A
2. String_B
3. String_C

Textdatei1.txt:

1. String_A
2. String_C

Also wenn die erste Zeile von der Textdatei2 (1.String_A) die gleiche ist wie diejenige von Textdatei1(1.String_A) dann soll die Zeile von der Textdatei 1 nicht überschrieben werden sonst soll sie überschrieben werden.

Wenn die zweite Zeile von der Textdatei2 (1.String_B) die gleiche ist wie diejenige von Textdatei1(1.String_C) dann soll die Zeile von der Textdatei 1 nicht überschrieben werden sonst soll sie überschrieben werden.

..usw

Danke für Eure Tipps

Gruß
dedalus2011

Content-ID: 188044

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

Ausgedruckt am: 24.11.2024 um 07:11 Uhr

bastla
bastla 15.07.2012 aktualisiert um 17:46:53 Uhr
Goto Top
Hallo dedalus2011!

Könntest Du vielleicht noch erklären, was mit "soll/soll nicht überschrieben werden" gemeint ist und was eigentlich das gewünschte Ergebnis (ebenfalls beispielhaft dargestellt) wäre?

Interessieren könnte Dich aber jedenfalls der Beitrag Zwei Texte Zeilenweise zusammenfügen per batch ...

Grüße
bastla
Darkprodukt
Darkprodukt 15.07.2012 aktualisiert um 18:12:07 Uhr
Goto Top
Hallo dedalus2011,

soweit ich das jezt erkenne würde doch danach Datei1 genauso wie Datei2 aussehen, oder?

Naja einfach ausgedrückt, du Überschreibst Datei1 mit Datei2.
Ist viel einfacher als ein Zeilenvergleich.

Grüße
Darkprodukt
dedalus2011
dedalus2011 15.07.2012 um 18:15:52 Uhr
Goto Top
das alles ist Teil eines Skripts der Zeilen von der Textdatei 2 in die Textdatei1 nur dann zurückschreiben soll wenn diese Zeilen in der Textdatei1 nicht mehr vorhanden sind. Die Anordnung der Zeilen in der Textdatei2 soll dabei erhalten sein.

Der Skript soll aber keine Zeilen in der Textdatei 1 überschreiben wenn diese bereits da sind.

Es ist eine Art "restore" aber ohne unnötiges Überschreiben/Verarbeiten. Es sind Textdateien die eine sehr hohe Anzahl an Zeilen haben und mit "findstr" verarbeitet werden. Dadurch dass die Zeilen die bereits da sind nicht mehr verarbeitet werden könnte die Laufzeit verbessern. Meine Überlegung halt...Geht das irgendwie?

Danke für jeglichen Hinweis

Gruß
dedalus2011
Darkprodukt
Darkprodukt 15.07.2012 aktualisiert um 18:23:18 Uhr
Goto Top
Naja wo wir gerade von Laufzeit sprechen.

Mir wurde gesagt das jeder Aufruf von finstr ~250ms Dauert.
Da erscheint mir ein einfaches überschreiben sehr viel einfacher.

Abgesehen davon.
In deinem Beispiel fehlt der Datei1 ja der String_B also würde der String_C ja mit String_B überschrieben werden.
Jezt wird danach auf String_C gestestet, der aber nicht mehr existiert, also würde String_D mit String_C überschrieben werden.

etc.pp.

Ich kan einfach nur empfehlen. Überschreib die Datei einfach.

Textdatein sind meistens nicht 1GB groß. Das ist nehmlich meist die Zeit wo das Warten vom Kopiervorgang nervt.

Grüße
Darkprodukt
bastla
bastla 15.07.2012 um 18:23:30 Uhr
Goto Top
Hallo dedalus2011!

Das klingt dann aber für mich so, wie es Darkprodukt schon interpretiert hat - soll demnach als Ergebnis der Inhalt der Textdatei 1 jenem von Textdatei 2 entsprechen (gleiche Zeilen bleiben unverändert, fehlende Zeilen werden ergänzt) oder kann es dann doch noch Unterschiede geben (weil etwa in Textdatei 1 Zeilen enthalten waren, die es in Textdatei 2 nicht gibt)?

Grüße
bastla
dedalus2011
dedalus2011 15.07.2012 aktualisiert um 19:17:57 Uhr
Goto Top
Sorry,da habe ich mich falsch ausgedrückt. Der Skript verteilt aus der Ursprungsdatei (Textdatei2) Zeilen in verschiedenen Dateien (aufwändige "findstr" Operationen). Durch einen Systemausfall könnte z.B. die Ausführung des Skripts abgebrochen werden und die Zieldateien (Textdatei1 und Textdatei2) bleiben unvollständig.

Ein restore durch ein einfaches überschreiben der Dateien mit der Ursprungsdatei ist daher keine Option. Meine Frage ist ja ob es möglich wäre die lange Laufzeit einer erneuten Ausführung des Skripts dadurch zu vermeiden, indem man zuerst prüft ob die Zeilen bereits da sind.

Eine mögliche Verteilung könnte so aussehen:

Ursprungsdatei.txt:

1. String_A
2. String_B
3. String_C

Textdatei1.txt:

1. String_A
2. String_C - fehlt, konnte wegen Skriptabbruch nicht geschrieben werden

Textdatei2.txt
2. String_B


Angenommen Textdatei1.txt konnte wegen einem Skriptabbruch nicht komplett geschrieben werden (z.B. string_C fehlt), sollte jetzt ein restore zuerst prüfen welche Zeilen aus der ersten (und der zweiten Textdatei) bereits vorhanden sind und von der Ausführungslogik der Filterung ausgeschlossen werden können (es sollen also keine teuren "findstr" operationen mehr ausgeführt werden für diese zeilen).
In dem Fall,würde die Filterung nur auf den fehlenden String_C angewandt.

Geht das irgendwie? Wenn nötig kann ich den kompletten Skript hier postenface-smile


Gruß
dedalus2011
Darkprodukt
Darkprodukt 15.07.2012 um 19:32:57 Uhr
Goto Top
Ok,

Also soll die Batch jede Zeile von Ursprungsdatei.txt Prüfen und feststellen ob diese sich in Textdatei1.txt oder Textdatei2.txt befindet.

Sobald eine Zeile Fehlt, kan das Script abbrechen und dem lengen Verteilerscript
die Zeile mitteilen an der es Fortfahren soll.

Richtig?
dedalus2011
dedalus2011 15.07.2012 um 20:22:03 Uhr
Goto Top
Ja, das wäre die Idee.. Wäre super wenn es klappen würde

Gruß
dedalus2011
Darkprodukt
Darkprodukt 16.07.2012 aktualisiert um 14:22:43 Uhr
Goto Top
Ok,

Es wäre dann Hilfreich, wenn du den Quellcode des verteilers Posten würdest.

Dann wird dabei Warscheinlich auch die Frage geklärt, wie man die Zeilennummer an dieses Weitergibt.

Grüße
Darkprodukt