miczar
Goto Top

Dateien zusammenführen inkl. finden von doppelten Einträgen

Hallo zusammen,

Ich habe im Netzwerk eine Master Datei (aufgebaut wie eine .txt) und mehrere PCs auf denen eine Kopie der Datei liegt.
Die Kopien werden unregelmäßig um weitere und auch verschiedene Einträge ergänzt.
Das hat zur Folge, dass auf den PCs nicht immer die selben Einträge vorhanden sind.

Ich möchte nun in zeitlichen Abständen, welche ich über den Windows Task steuer, ein Script ausführen, welches alle Dateien auf den selben Stand bringt.

Das von mir bislang verwendete Script kopiert den Inhalt aller Dateien, vergleicht anschließend den Inhalt auf doppelte Einträge, löscht diese raus und verteilt dann die „neue“ wieder an alle PCs.
Das funktioniert zwar alles, hat allerdings diverse Nachteile.

Eine Datei hat ca. 3500 Zeilen und das vergleichen der doppelten Einträge bei 5 zusammenkopierten Dateien (über 17000 Einträge) dauert relativ lange. Das alleine wäre jetzt nicht das größte Problem.
Nicht praktikabel ist dagegen der Umstand, dass wenn in einer der Dateien ein fehlerhafter Eintrag vorhanden ist und dieser nach dem Abgleich angepasst wird, der fehlerhafte Eintrag danach auf Grund des Vergleichs wieder da ist. Hier muss manuell in allen Dateien der entsprechende Eintrag angepasst werden. Solche manuellen Arbeitsschritte wollte ich mit der Scriptidee eigentlich umgehen bzw. auf ein Mindestmaß reduzieren.

Jetzt stelle ich mir folgendes vor:

Das Script liest zunächst die letzte Zeile aus der Master Datei als Variable ein und erstellt eine, nennen wir sie, Hilfsdatei mit dem vollständigen Inhalt der Master.
Anschließend wird der Inhalt der Variable in den PC Dateien gesucht und nur noch das kopiert was nachfolgend vorhanden ist.
Danach wird nach doppelten Einträgen gesucht und der Inhalt der bereinigten und vollständig ergänzten Hilfsdatei auf die PC verteilt.

Das hätte dann den Vorteil, dass alles was bis zum nächsten Abgleich in der Masterdatei angepasst wird , definitiv auch so unverändert auf die PCs verteilt wird und
außerdem hätte man so die zu überprüfende Anzahl an Zeilen erheblich reduziert.

Nur zum Verständnis noch mal:

MASTER
.
.
.
234562 Test1 0 0 0
827641 Test2 0 0 0
003928 Test3 0 0 0
0002.23.98371 Test4 0 0 0

PC1
.
.
0002.23.98371 Test4 0 0 0
994832 Test5 0 0 0
88291643 Test8 0 0 0

PC2
.
.
0002.23.98371 Test4 0 0 0
0028376 Test9 0 0 0
9948372 Test10 0 0 0

Neu erstellte Datei auf allen PCs inkl. Master
.
.
234562 Test1 0 0 0
827641 Test2 0 0 0
003928 Test3 0 0 0
0002.23.98371 Test4 0 0 0
994832 Test5 0 0 0
88291643 Test8 0 0 0
0028376 Test9 0 0 0
9948372 Test10 0 0 0


Zum einlesen der letzten Zeile als Variable habe ich bereits hier im Forum folgendes gefunden:

@echo off & setlocal 

set "LetzteZeile="   
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "Datei.cxu"') do set "LetzteZeile=%%j"   
echo\%LetzteZeile%

und das bislang verwendete Script sieht so aus:

@echo off 
setlocal enabledelayedexpansion


set "alias=\\Server \Datei.cxu"  
set "alias1=\\PROG-1\ Datei.cxu"  
set {{comment_strings:42566572919}} 
set {{comment_strings:42504726022}} 
set "alias4=\\PROG-4\ Datei.cxu"  
set {{comment_strings:43409637834}} 
set "Bak=.bak"   
set /a LineNo=0 

::die PC Dateien werden mit der auf dem Server verglichen. Gibt es keinen Unterschied, wird das Script beendet.

if NOT exist !alias1! goto 2
	fc !alias! !alias1!
	if errorlevel 1 goto filedif

:2
if NOT exist !alias2! goto 3
	fc !alias! !alias2!
	if errorlevel 1 goto filedif

:3
if NOT exist !alias3! goto 4
	fc !alias! !alias3!
	if errorlevel 1 goto filedif

:4
if NOT exist !alias4! goto eof
	fc !alias! !alias4!
	if errorlevel 1 goto filedif

goto eof

::unterscheidet sich eine Datei von der auf dem Server, wird der Inhalt aller Dateien zu einer gesamten zusammengefasst 

:filedif

	type !alias1! > !Datei!
	type !alias2! >> !Datei!
	type !alias3! >> !Datei!
	type !alias4! >> !Datei!

{{comment_single_line_remark:2}}

move "%Datei%" {{comment_strings:23285443499}}   
copy nul "%Datei%">nul   
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine   
del "%Datei%%Bak%"   

	xcopy /y /q "%Datei%" "%alias%" > NUL  
	xcopy /y /q {{comment_strings:43784143573}} "%alias1%" > NUL  
	xcopy /y /q {{comment_strings:22733338690}} "%alias2%" > NUL  
	xcopy /y /q "%Datei%" "%alias3%" > NUL  
	xcopy /y /q "%Datei%" "%alias4%" > NUL  

del "%Datei%" 	  
	
goto :eof 

:ProcessLine 
set /a LineNo+=1 
echo vergleiche Zeile %LineNo% ... 
findstr /b /c:"%Zeile:~,20%" "%Datei%">nul || >>"%Datei%" echo %Zeile%   

goto :eof

Beides für sich funktioniert soweit. Mir fehlt der Part um mittels der Variable %LetzteZeile% nur noch die nachfolgenden Zeilen und nicht den kompletten Inhalt aus den PC Dateien zu kopieren.

Ich hoffe, dass ich den Kern des Problems trotz der Beitragslänge verständlich rüber bringen konnte und mir dabei jemand hilft.
Eventuell ist meine bisherige Lösung aber auch viel zu umständlich und es gibt eine wesentlich bessere bzw. optimierte Lösung.

Danke und Gruß
Mike

Content-ID: 321303

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

Ausgedruckt am: 08.11.2024 um 03:11 Uhr

Endoro
Endoro 17.11.2016 um 21:17:59 Uhr
Goto Top
Hey,

Zitat von @miczar:

Nicht praktikabel ist dagegen der Umstand, dass wenn in einer der Dateien ein fehlerhafter Eintrag vorhanden ist und dieser nach dem Abgleich angepasst wird, der fehlerhafte Eintrag danach auf Grund des Vergleichs wieder da ist. Hier muss manuell in allen Dateien der entsprechende Eintrag angepasst werden. Solche manuellen Arbeitsschritte wollte ich mit der Scriptidee eigentlich umgehen bzw. auf ein Mindestmaß reduzieren.

Das ist keine Frage für ein Forum, sondern ein Projekt. Meine Meinung face-wink

Gruß, Endoro
miczar
miczar 18.11.2016 um 14:12:11 Uhr
Goto Top
Hallo Endoro,

naja ich habe ja eigentlich bereits den Kern selber erarbeitet bzw. zusammengeführt.

Es geht im Endeffekt nur noch darum wie ich in den PC Dateien den String aus der Variable %LetzterEintrag% suche um nur die nachfolgenden Einträge kopieren zu lassen.

Dann kann ich zumindest weiter probieren.

Gruß
Mike
miczar
miczar 18.11.2016 um 21:13:30 Uhr
Goto Top
Problem gelöst. Wenn auch noch nicht ganz aber dazu erstelle ich ein neues Thema da die Problematik eine andere ist.

Gruß
Mike