Frage zum Verteilen von xml-Dateien nach ihren Inhalten auf der Grundlage von Daten aus Schlüsseldatei
Verschieben von xml-Datei aufgrund mehrerer Angaben aus externer Zuordnungsdatei
Hallo liebe Onliner,
nachdem ich das Forum rauf und runter durchsucht habe, und leider erst gerade mit Batch Programmierung begonnen habe, wende ich mich mit meinem Hilfeersuchen einmal an die fortgeschrittenen aus dem Forum:
Aus einem Abrechnungsprogramm erhalte ich pro Minute eine XML Datei "default.xml", die ich aufgrund von Bedingungen, die in einer Datei "Kostenstellen.txt" eingetragen ist, in Unterverzeichnisse z.B. 3080 für Kostenstelle 3080 verschieben möchte. Alles, was nicht sicher einer Kostenstelle zugeordnet werden kann, soll in einen Ordner c:\Rest geschoben werden
Kostenstellen.txt
"Keller-Stübchen"; x=230-240; y=700-801; c:\3080
"Keller - Stuebchen"; x=230-240; y=700-801; c:\3080
"Bar-Raum"; x=123-240; y=100-151; C:\2060
(...)
Legende:
"Suchtext";valider Range für coordx;valider Range für coordy; Zielverzeichnis
eintreffende XML Dateien "c:\Data\Default.xml" mit foldendem Inhalten
<roomiD Coordx="225" Coordy="856">"Keller-Stübchen"</roomid>
<roomiD Coordx="225" Coordy="856">"keller-stuebchen"</roomid>
<roomiD Coordx="225" Coordy="856">"Barraum"</roomid>
<roomiD Coordx="235" Coordy="456">"Keller - Stübchen"</roomid>
(...)
Kiffelig wird es nun dadurch,
dass z.B. der Wert "Keller-Stübchen" in der xml-Datei zwar mehrfach auftauchen kann, aber immer von eindeutigen Werten für Coordx und Coordy begleitet wird und nur dann einer Kostenstelle zugeordnet werden darf, wenn wenigstens ein Vorkommen bezgl. beider Koordinaten im durch die Datei Kostenstellen.txt vorgegeben Range liegt.
Den Inhalt der Datei "Kostenstellen.txt" kann ich beeinflussen,
also z.B. auch für Umlaut-/Sonderzeichenvarienten, die in der XML-Datei vorkommen können, mehrere Einträge einstellen.
Die "Kostenstellen.txt" hat zwischen 50 und 60 Zeilen, die XML-Datei kann bis zu 500 Zeilen haben. Die XML Datei ist immer zunächst nach COORDX und dann nach COORDY soriert.
Gibt es eine Möglichkeit, die Zuordnung per Batch zu realisiern?
Bin für jede Idee dankbar.
Gruß
mispel
Hallo liebe Onliner,
nachdem ich das Forum rauf und runter durchsucht habe, und leider erst gerade mit Batch Programmierung begonnen habe, wende ich mich mit meinem Hilfeersuchen einmal an die fortgeschrittenen aus dem Forum:
Aus einem Abrechnungsprogramm erhalte ich pro Minute eine XML Datei "default.xml", die ich aufgrund von Bedingungen, die in einer Datei "Kostenstellen.txt" eingetragen ist, in Unterverzeichnisse z.B. 3080 für Kostenstelle 3080 verschieben möchte. Alles, was nicht sicher einer Kostenstelle zugeordnet werden kann, soll in einen Ordner c:\Rest geschoben werden
Kostenstellen.txt
"Keller-Stübchen"; x=230-240; y=700-801; c:\3080
"Keller - Stuebchen"; x=230-240; y=700-801; c:\3080
"Bar-Raum"; x=123-240; y=100-151; C:\2060
(...)
Legende:
"Suchtext";valider Range für coordx;valider Range für coordy; Zielverzeichnis
eintreffende XML Dateien "c:\Data\Default.xml" mit foldendem Inhalten
<roomiD Coordx="225" Coordy="856">"Keller-Stübchen"</roomid>
<roomiD Coordx="225" Coordy="856">"keller-stuebchen"</roomid>
<roomiD Coordx="225" Coordy="856">"Barraum"</roomid>
<roomiD Coordx="235" Coordy="456">"Keller - Stübchen"</roomid>
(...)
Kiffelig wird es nun dadurch,
dass z.B. der Wert "Keller-Stübchen" in der xml-Datei zwar mehrfach auftauchen kann, aber immer von eindeutigen Werten für Coordx und Coordy begleitet wird und nur dann einer Kostenstelle zugeordnet werden darf, wenn wenigstens ein Vorkommen bezgl. beider Koordinaten im durch die Datei Kostenstellen.txt vorgegeben Range liegt.
Den Inhalt der Datei "Kostenstellen.txt" kann ich beeinflussen,
also z.B. auch für Umlaut-/Sonderzeichenvarienten, die in der XML-Datei vorkommen können, mehrere Einträge einstellen.
Die "Kostenstellen.txt" hat zwischen 50 und 60 Zeilen, die XML-Datei kann bis zu 500 Zeilen haben. Die XML Datei ist immer zunächst nach COORDX und dann nach COORDY soriert.
Gibt es eine Möglichkeit, die Zuordnung per Batch zu realisiern?
Bin für jede Idee dankbar.
Gruß
mispel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85706
Url: https://administrator.de/forum/frage-zum-verteilen-von-xml-dateien-nach-ihren-inhalten-auf-der-grundlage-von-daten-aus-schluesseldatei-85706.html
Ausgedruckt am: 02.05.2025 um 13:05 Uhr
7 Kommentare
Neuester Kommentar
Hallo mispel und willkommen im Forum!
Auch wenn noch Fragen bzw Vorschläge offen bleiben, sollte der folgende Entwurf im Prinzip funktionieren:
Eine wichtige Frage betrifft das Verschieben, das hier vorerst nur durch die Ausgabe des "move"-Befehls (wegen des "echo" davor) simuliert wird: Eigentlich sollte es doch sehr wahrscheinlich sein, dass im jeweils ermittelten Kostenstellen-Ordner bereits eine "default.xml" liegt - es kann dann wohl nicht das Ziel sein, diese einfach zu überschreiben?
Zur Gestaltung der Kostenstellen.txt noch einige Anmerkungen, welche für mehr Sicherheit sorgen bzw die Verabeitung beschleunigen könnten:
- Die Leerzeichen nach den ";" sind eher kontraproduktiv und sollten daher weggelassen werden.
- Aus "x=230-240" würde ich einfach "230;240" machen (da ja die Reihenfolge ohnehin vorgegeben ist), wodurch eine weitere Zerlegung (durch je eine "for"-Zeile) überflüssig würde.
- Die "Suchtexte" benötigen eigentlich keine umschließenden Anführungszeichen - durch letztere wird es schwieriger, die Suche auf den Zeilenanfang zu begrenzen (auch wenn es kaum eine Verwechslungsmöglichkeit mit Texten aus dem Rest der Zeile geben dürfte).
- Dass alle Schreibweisen (zB "Barraum" vs "Bar-Raum" oder "keller-stuebchen" mit und ohne Leerzeichen) abgedeckt sein sollten, wäre ebenfalls nochmals zu betonen.
Schließlich stellt sich noch die Frage, wie der Batch gestartet werden soll, bzw ob beabsichtigt ist, ihn immer im Hintergrund laufen zu lassen - in letzterem Falle wäre zumindest eine Warteschleife (bis wieder eine "default.xml" verfügbar ist) am Anfang sinnvoll.
Grüße
bastla
Auch wenn noch Fragen bzw Vorschläge offen bleiben, sollte der folgende Entwurf im Prinzip funktionieren:
@echo off & setlocal
set "XML=C:\default.xml"
set "KStListe=C:\Kostenstellen.txt"
set "Rest=C:\Rest"
set Ziel=
for /f "usebackq tokens=1-2 delims=<>" %%i in ("%XML%") do (
for /f "tokens=3,5 delims== " %%x in ("%%i") do (
set "KSt=%%~j" & set "X=%%~x" & set "Y=%%~y" & call :ProcessLine
)
)
if not defined Ziel set "Ziel=%Rest%"
echo move "%XML%" "%Ziel%\"
goto :eof
:ProcessLine
if defined Ziel goto :eof
findstr /i "%KSt%" "%KStListe%">nul || goto :eof
for /f "tokens=2-4 delims=; " %%i in ('findstr /i /c:"%KSt%" "%KStListe%"') do set "XRange=%%i" & set "YRange=%%j" & set "Ordner=%%k"
for /f "tokens=2,3 delims==-" %%i in ("%XRange%") do set "XLow=%%i" & set "XHigh=%%j"
for /f "tokens=2,3 delims==-" %%i in ("%YRange%") do set "YLow=%%i" & set "YHigh=%%j"
if %X% lss %XLow% goto :CheckY
if %X% leq %XHigh% set "Ziel=%Ordner%" & goto :eof
:CheckY
if %y% lss %YLow% goto :eof
if %Y% leq %YHigh% set "Ziel=%Ordner%"
goto :eof
Zur Gestaltung der Kostenstellen.txt noch einige Anmerkungen, welche für mehr Sicherheit sorgen bzw die Verabeitung beschleunigen könnten:
- Die Leerzeichen nach den ";" sind eher kontraproduktiv und sollten daher weggelassen werden.
- Aus "x=230-240" würde ich einfach "230;240" machen (da ja die Reihenfolge ohnehin vorgegeben ist), wodurch eine weitere Zerlegung (durch je eine "for"-Zeile) überflüssig würde.
- Die "Suchtexte" benötigen eigentlich keine umschließenden Anführungszeichen - durch letztere wird es schwieriger, die Suche auf den Zeilenanfang zu begrenzen (auch wenn es kaum eine Verwechslungsmöglichkeit mit Texten aus dem Rest der Zeile geben dürfte).
- Dass alle Schreibweisen (zB "Barraum" vs "Bar-Raum" oder "keller-stuebchen" mit und ohne Leerzeichen) abgedeckt sein sollten, wäre ebenfalls nochmals zu betonen.
Schließlich stellt sich noch die Frage, wie der Batch gestartet werden soll, bzw ob beabsichtigt ist, ihn immer im Hintergrund laufen zu lassen - in letzterem Falle wäre zumindest eine Warteschleife (bis wieder eine "default.xml" verfügbar ist) am Anfang sinnvoll.
Grüße
bastla
Hallo mispel!
Wenn das Verschieben geklärt ist, bliebe noch die Frage nach dem Start ...

Grüße
bastla
P.S.:

... noch in der Verstehenphase..
Sorry, zum Kommentieren war ich schon etwas zu müde ...... ändere gerade die Kostenstellen.txt.
Zum Testen solltest Du noch die alte Version verwenden, da ich von der oben beschriebenen Struktur ausgegangen bin.Wenn das Verschieben geklärt ist, bliebe noch die Frage nach dem Start ...
Dazu darf ich dann vielleicht noch einmal fragen, wenn ich es gar nciht hinbekomme ..?
Das ist durchaus der Sinn dieses Forums ... Grüße
bastla
P.S.:
hätte ich mal in der Schule besser aufgepaßt 
In Deiner Schule wurde tatsächlich gebatcht?
Hallo mispel!
Die Idee bei den Abfragen ist folgende:
Wenn der X-Wert des Datensatzes unterhalb der Untergrenze lt Kostenstellendatei liegt, kann gleich mit der Überprüfung des Y-Wertes fortgesetzt werden (X passt sicher nicht).
Wenn der X-Wert <= Obergrenze (> Untergrenze ist er sicher, sonst wären wir nicht mehr hier), haben wir die richtige Kostenstelle gefunden, daher ausgelesenen Ordner als Ziel speichern und fertig. %Ziel% funktioniert gleichzeitig als Schalter - wenn die Variable einen Inhalt hat, konnte die Zuordnung vorgenommen werden.
Für den Y-Wert gelten die gleichen Überlegungen.
Die Reihenfolge kannst Du natürlich auch umkehren und mit der Überprüfung von Y beginnen.
Deine Idee mit dem Schalter "ok" würde daran scheitern, dass es schon genügte, dass der Y-Wert mindestens der Untergrenze entspricht - ab diesem Zeitpunkt wäre "ok" bereits 1 und würde sich nicht mehr ändern (auch, wenn die Y-Obergrenze überschritten wäre).
Spätestens aber ab der zweiten Abfrage muss dann "ok" den Wert 1 aufweisen (wenn nämlich vorher unter %YLow%, so jetzt sicher unter %YHigh%).
Grüße
bastla
Die Idee bei den Abfragen ist folgende:
if %X% lss %XLow% goto :CheckY
if %X% leq %XHigh% set "Ziel=%Ordner%" & goto :eof
Für den Y-Wert gelten die gleichen Überlegungen.
Die Reihenfolge kannst Du natürlich auch umkehren und mit der Überprüfung von Y beginnen.
Deine Idee mit dem Schalter "ok" würde daran scheitern, dass es schon genügte, dass der Y-Wert mindestens der Untergrenze entspricht - ab diesem Zeitpunkt wäre "ok" bereits 1 und würde sich nicht mehr ändern (auch, wenn die Y-Obergrenze überschritten wäre).
Spätestens aber ab der zweiten Abfrage muss dann "ok" den Wert 1 aufweisen (wenn nämlich vorher unter %YLow%, so jetzt sicher unter %YHigh%).
Grüße
bastla
Hallo mispel!
Ich hatte
Um beide Koordinaten zu erfassen, sähe der Auswertungsteil etwa so aus:
Grüße
bastla
Ich hatte
... wenn wenigstens ein Vorkommen bezgl. beider Koordinaten im durch die Datei Kostenstellen.txt vorgegeben Range liegt.
anders interpretiert - das "Vorkommen" bezieht sich demnach auf die Datensätze der XML-Datei.Um beide Koordinaten zu erfassen, sähe der Auswertungsteil etwa so aus:
if %X% lss %XLow% goto :eof
if %X% gtr %XHigh% goto :eof
if %y% lss %YLow% goto :eof
if %Y% gtr %YHigh% goto :eof
set "Ziel=%Ordner%"
goto :eof
Grüße
bastla