Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage zum Verteilen von xml-Dateien nach ihren Inhalten auf der Grundlage von Daten aus Schlüsseldatei

Frage Entwicklung Batch & Shell

Mitglied: mispel

mispel (Level 1) - Jetzt verbinden

16.04.2008, aktualisiert 17.04.2008, 3539 Aufrufe, 7 Kommentare

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
Mitglied: bastla
17.04.2008 um 02:03 Uhr
Hallo mispel und willkommen im Forum!

Auch wenn noch Fragen bzw Vorschläge offen bleiben, sollte der folgende Entwurf im Prinzip funktionieren:
01.
@echo off & setlocal 
02.
set "XML=C:\default.xml" 
03.
set "KStListe=C:\Kostenstellen.txt" 
04.
set "Rest=C:\Rest" 
05.
 
06.
set Ziel= 
07.
for /f "usebackq tokens=1-2 delims=<>" %%i in ("%XML%") do ( 
08.
	for /f "tokens=3,5 delims== " %%x in ("%%i") do ( 
09.
		set "KSt=%%~j" & set "X=%%~x" & set "Y=%%~y" & call :ProcessLine 
10.
11.
12.
if not defined Ziel set "Ziel=%Rest%" 
13.
echo move "%XML%" "%Ziel%\" 
14.
goto :eof 
15.
 
16.
:ProcessLine 
17.
if defined Ziel goto :eof 
18.
findstr /i "%KSt%" "%KStListe%">nul || goto :eof 
19.
 
20.
for /f "tokens=2-4 delims=; " %%i in ('findstr /i /c:"%KSt%" "%KStListe%"') do set "XRange=%%i" & set "YRange=%%j" & set "Ordner=%%k" 
21.
for /f "tokens=2,3 delims==-" %%i in ("%XRange%") do set "XLow=%%i" & set "XHigh=%%j" 
22.
for /f "tokens=2,3 delims==-" %%i in ("%YRange%") do set "YLow=%%i" & set "YHigh=%%j" 
23.
 
24.
if %X% lss %XLow% goto :CheckY 
25.
if %X% leq %XHigh% set "Ziel=%Ordner%" & goto :eof 
26.
:CheckY 
27.
if %y% lss %YLow% goto :eof 
28.
if %Y% leq %YHigh% set "Ziel=%Ordner%" 
29.
goto :eof
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
Bitte warten ..
Mitglied: mispel
17.04.2008 um 12:16 Uhr
Hallo bastla,
sieht ja genial aus.. !!

Bin einwenig platt und noch in der Verstehenphase.. - (hätte ich mal in der Schule besser aufgepaßt )

Was das Verschieben der default.xml betrifft, habe ich unterschlagen zu sagen, daß ich watchdirectory als hotfolder-tool einsetze und damit die default.xml gleich wieder umbenenne bzw wegräume. (ist vielleicht unsportlich, das Tool hilft mir aber sehr)

Ich versuche gerade, deine Ratschläge bzgl. Leerzeichen und Koordinaten und der zweiten for-Zeile umzusetzen sowie Suchtexte wegen "" abzuändern und ändere gerade die Kostenstellen.txt.

Dazu darf ich dann vielleicht noch einmal fragen, wenn ich es gar nciht hinbekomme ..?


Gruß + Danke

mispel
Bitte warten ..
Mitglied: bastla
17.04.2008 um 12:30 Uhr
Hallo mispel!
... 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?
Bitte warten ..
Mitglied: mispel
17.04.2008 um 17:22 Uhr
Hallo bastla,

irgendwie klappt es nich nicht so ganz..die if-Statements machen mir noch Probleme..

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%"

nach meinem Verständnis müßte es irgendwie in die foldende Richtung gehen:


if %y% geq %YLow% set "ok=1"
if %Y% leq %YHigh% set "ok=1"
if %X% geq %XLow% set "ok=1"
if %X% leq %XHigh% set "ok=1"


if %ok% equ 1 set Ziel=%Ordner% else set "Ziel=" & set "ok="


..funktioniert aber auch nicht (Syntax..) und mein Hirn ist schon ein wenig matschig..


Grüße
mispel


P.S. ja damals in der Schule gab es mal eine Informatik AG, aber da hab ich lieber mit den Mädels geflirtet...
Bitte warten ..
Mitglied: bastla
17.04.2008 um 17:38 Uhr
Hallo mispel!

Die Idee bei den Abfragen ist folgende:
01.
if %X% lss %XLow% goto :CheckY
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).

01.
if %X% leq %XHigh% set "Ziel=%Ordner%" & goto :eof
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
Bitte warten ..
Mitglied: mispel
17.04.2008 um 18:09 Uhr
Hallo bastla,

-vorweg erstmal vielen Dank für Deine Mühe - bin Dir wirklich sehr dankbar...-

das Problem ist, dass sowohl x als auch y gleichzeitig im Range sein müssen -
ein Wert reicht nicht.
Wahrscheinlich habe ich das in der abendlichen Ermüdung gestern nicht mehr so genau auf die Reihe bekommen.

So, wie ich es jetzt verstehe, gibt es in der ursprünglichen Version auch einen Move-Vorgang in ein KOST Verzeichnis, wenn nur der Y-Wert im Range ist. Wenn aber in der gesamten XML-Datei bei keinem Suchwort X und Y (gleichzeitig) in den jeweiligen Ranges für das Suchwort liegen, muß es in den Rest gehen.

Das Umdrehen von X und Y ist mehr aus Versehen beim Rumprobieren passiert.


Grüße
mispel
Bitte warten ..
Mitglied: bastla
17.04.2008 um 19:03 Uhr
Hallo mispel!

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:
01.
if %X% lss %XLow% goto :eof 
02.
if %X% gtr %XHigh% goto :eof 
03.
if %y% lss %YLow% goto :eof 
04.
if %Y% gtr %YHigh% goto :eof 
05.
set "Ziel=%Ordner%" 
06.
goto :eof
Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst XML-Datei: Pfade suchen, verlinkte Dateien kopieren und Pfade ändern (4)

Frage von ELEVATOR zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...