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:
und das bislang verwendete Script sieht so aus:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 321303
Url: https://administrator.de/contentid/321303
Ausgedruckt am: 08.11.2024 um 03:11 Uhr
3 Kommentare
Neuester Kommentar
Hey,
Das ist keine Frage für ein Forum, sondern ein Projekt. Meine Meinung
Gruß, Endoro
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.
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
Gruß, Endoro