20309
Goto Top

Daten aus XML Dateien extrahieren und in Excel einfügen

Hallo,

ich habe mehrere XML Dateien (täglich eine), die automatisch als log für einen Exchange Server generiert werden.

Es geht jetzt erst mal um nur 1 dieser Dateien.
In der XML Datei sind etliche Zeilen XML Code enthalten. Mich interresieren daraus aber nur wenige Angaben, die ich in eine Excel Tabelle einfügen muss.

Dabei geht es um:

- Anzahl der E-Mail Nachrichten
- Anzahl der Ordner
- Anzahl der Mailboxen

...
<summary>
<backed_up_exchange_mailbox>12345 E-Mail-Nachricht(en) in 123 Ordner(n) in 123 Mailboxen gesichert</backed_up_exchange_mailbox>
<new_processed_bytes>12,345,657 Byte verarbeitet in 1 Stunden, 23 Minuten und 4 Sekunden.</new_processed_bytes>
<vlm_hist_rateformat2>Durchsatzrate: 123 MB/Min.</vlm_hist_rateformat2>
</summary>
...

Der Rest ist uninterresant.


Wie kann ich diese Angaben denn nun in Excel bekommen?
Da es etliche solcher Dateien sind, wär es eine irsinnige Arbeit, alles per Hand in Excel einzutragen.


Hoffe mir kann jemand weiterhelfen face-smile


MfG
Torsten.

Content-Key: 31011

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

Printed on: April 16, 2024 at 20:04 o'clock

Member: gabrielgn
gabrielgn Apr 24, 2006 at 10:18:30 (UTC)
Goto Top
In Java könnte man das (Daten aus XML extrahieren) mit Hilfe von SAX oder DOM machen. Das Thema "in Excel einfügen habe ich auch im Zusammenhang mit Java gehört, aber selber nie probiert. Dennoch meine ich, dass es möglich ist.
Mitglied: 20309
20309 Apr 24, 2006 at 10:20:46 (UTC)
Goto Top
Hallo,

hab leider absolut kein Plan von Java face-sad
Auch mit XML kenn ich mich eigentlich null aus.

Wäre halt cool gewesen wenn ich es trotzdem irgendwie hin bekmomen würde face-smile

Also es muss jetzt nicht zwingend in Excel eingefügt werden - wäre aber vorteilhaft.

Wenn ich jetzt die 3 Zahlenwerte in ne txt-Datei bekomme, wäre das auch schon ne grosse Hilfe!

Gibts nicht irgend ein Befehl, dass ich sagen kann "Gehe in Zeile xy, nimm die 1. Zahl und schreibe sie in die Datei xz" ??
Member: Biber
Biber Apr 24, 2006 at 11:11:06 (UTC)
Goto Top
Du könntest mit einem Batch drüberlaufen und aus den relevanten XML-Tags mit einer FOR /F ...In (xmldate.xml) Do..-Anweisung eine *csv-Datei generieren.

Aber mit dem oben beschriebenen Sax-Parser wäre es etwas professioneller.
Ist das oben gepostete eine realistische XML-Datei?
Wenn ja, ist die Aufdröselung ziemlich simpel:

(Test am CMD-Promptface-smile
for /f "delims=<> tokens=1-3" %i in (beispiel.xml) do @if [%i==backed_up_exchange_mailbox] @echo %j
12345 E-Mail-Nachricht(en) in 123 Ordner(n) in 123 Mailboxen gesichert

...und aus diesen Rohdaten wiederum Einzelfelder machen.
Und wenn Dich aus dieser "großen" XML-Datei nur 3 Tags interessieren, dann kannst Du vorher die relevaten Daten sogar mir "find" extrahieren.

Find "backed_up_exchange_mailbox" beispiel.xml >NurBackupSums.xml
..etc.

Grüße
Biber
Mitglied: 20309
20309 Apr 24, 2006 at 11:19:55 (UTC)
Goto Top
Also der oben geschriebene Textauszug ist aus einer existierenden XML Datei (mit ausgedachten Zahlenwerten). Die XML Datei ist noch um einige Zeilen länger face-smile

Habe jetzt den Befehl mal in ne Dosbox (also cmd) eingegeben aber leider passiert nix:

for /f "delims=<> tokens=1-3" %i in (test.xml) do @if [%i==backed_up_exchange_mailbox] @echo %j

oder:

for /f "delims=<> tokens=1-3" %i in (c:\xml\test.xml) do @if [%i==backed_up_exchange_mailbox] @echo %j

Die XML Datei heisst "test.xml" und liegt unter C:\xml\test.xml

Oder anders gefragt, was sollte denn passieren, wenn ich den Befehl unter cmd eingeb?


Und das mit dem "find" (Find "backed_up_exchange_mailbox" beispiel.xml >NurBackupSums.xml)

Muss ich dass auch in cmd eingeben? Oder wie?


Sorry für die blöden Fragen, kenn mich aber damit nicht wirklich aus.
Member: Biber
Biber Apr 24, 2006 at 11:28:35 (UTC)
Goto Top
Sorry, hatte zwei Zeichen zu viel gelöscht, pardon

for /f "delims=<> tokens=1-2" %i in (c:\xml\test.xml) do @if [%i]==[backed_up_exchange_mailbox] @echo %j

-oder-

for /f "delims=<> tokens=1-2" %i in ('Find "backed_up_exchange_mailbox" c:\xml\test.xml') do @echo %j

Die zweite Variante ist natürlich -zigmal schneller.

Gruß
biber
Mitglied: 20309
20309 Apr 24, 2006 at 13:02:53 (UTC)
Goto Top
Was sollte denn passieren?

Bei mir kommt folgende ausgabe (cmd):

C:\XML>for /f "delims=<> tokens=1-2" %i in ('Find "backed_up_exchange_mailbox" c
:\xml\test.xml') do @echo %j
ECHO ist eingeschaltet (ON).
summary
new_processed_bytes
summary
new_processed_bytes

C:\XML>
Member: Biber
Biber Apr 24, 2006 at 13:21:31 (UTC)
Goto Top
Das hier:
(=15:19:57 D:\temp=)

for /f "delims=<> tokens=1-2" %i in ('Find "backed_up_exchange_mailbox" f:\beispiel.xml') do @echo.%j

12345 E-Mail-Nachricht(en) in 123 Ordner(n) in 123 Mailboxen gesichert

-- ich schalte mal auf PN-Mode -- please mail a sample xmlfile to me... ---
Mitglied: 20309
20309 Apr 25, 2006 at 08:04:11 (UTC)
Goto Top
Also mit dem Befehl:
Find "backed_up_exchange_mailbox" beispiel.xml >NurBackupSums.txt
hab ich jetzt genau dass, wass ich will in einer txt. Datei:


TEST.XML
</end_time><summary><backed_up_exchange_mailbox>653897 E-Mail-Nachricht(en) in 27355 Ordner(n) in 1110 Mailboxen gesichert
</backed_up_exchange_mailbox><new_processed_bytes>65,491,320,355 Byte verarbeitet in 9 Stunden, 13 Minuten und 7 Sekunden.
</end_time><summary><backed_up_exchange_mailbox>22941 E-Mail-Nachricht(en) in 266 Ordner(n) in 0 Mailboxen gesichert
</backed_up_exchange_mailbox><new_processed_bytes>2,320,620,068 Byte verarbeitet in 21 Minuten und 56 Sekunden.

mich interessieren jetzt allerdings nur diese beiden Sätze:
1. 653897 E-Mail-Nachricht(en) in 27355 Ordner(n) in 1110 Mailboxen gesichert
2. 22941 E-Mail-Nachricht(en) in 266 Ordner(n) in 0 Mailboxen gesichert

Wie kann ich diese denn jetzt aus der Datei rausziehn?
Und dann in Excel bekommen??

Oh man, das muss doch gehn face-smile
Member: Biber
Biber Apr 25, 2006 at 10:39:16 (UTC)
Goto Top
..der Rest ist pillepalle:


(=12:33:11 D:\temp=) Demo am CMD-Prompt:
for /f "tokens=1,4,7" %i in ("12345 E-Mail-Nachricht(en) in 123 Ordner(n) in 123 Mailboxen gesichert") do @echo %i %j %k
12345 123 123

-oder im Batch:
Find "backed_up_exchange_mailbox" beispiel.xml|find "summary" >NurBackupSums.txt
for /f "tokens=1,4,7" %%i in (NurbackupSums.txt) do @echo %%i ;%%j;%%k >>Summary.csv

Dann stehen die drei Zahlen in der Summary.csv.

Thats all.
Gruß
Biber
Mitglied: 20309
20309 May 04, 2006 at 07:29:28 (UTC)
Goto Top
Hallo,

bin soweit jetzt klar gekommen, mit folgendem Befehl:

Find "backed_up_exchange_mailbox" *.xml >temp.xls

Nun hab ich noch eine zweite Zeile in der XML Datei, die ich gerne mit in die xls Datei geschrieben hätte... Name in der XML Datei: "start_time"

Kann ich mit dem FIND nicht nach 2 Werten in der XML Datei suchen lassen?

Also so in der Art: Find "backed_up_exchange_mailbox" && "start_time" *.xml >temp.xls


SGE-2001
Member: Biber
Biber May 04, 2006 at 07:47:32 (UTC)
Goto Top
Nein, SGE-2001,
Du musst 2 Find-Befehle nacheinander eingeben:

Find "backed_up_exchange_mailbox" beispiel.xml >NurBackupSums.txt
..und danach:
Find "start_time" beispiel.xml >>NurBackupSums.txt

Beachten musst Du nur, dass der zweite Find-Befehl "anhängen" soll mit ">>" statt die Extraktdatei neu zu erzeugen.

Alternativ könntest Du auch "Findstr.exe" statt "Find" verwenden. Dort kannst Du auch nach mehreren Suchtexten suchen.
Siehe in der Hilfe ( "FindStr.exe /?" )

Gruß
Biber
Mitglied: 20309
20309 May 09, 2006 at 09:11:21 (UTC)
Goto Top
Hallo,

das mit den 2 Find Befehlen funktioniert zwar soweit, allerdings bei mehreren XML Dateien wird erst in allen XML Dateien nach "backed_up_exchange_mailbox" gesucht, das gefundene in die XLS Datei geschrieben; danach wird nach "start_time" gescuht und das gefundene auch in die XLS Datei geschreieben - nur halt hintendran.

Ich bräuchte es aber so, dass erst in der 1. XML Datei nach backed_up_exchange_mailbox", dann nach "start_time" gesucht wird, dass in eine XLS Datei geschriben wird und danach erst die nächste XML Datei durchsucht wird ... hoffe das war verständlich face-smile

Hier mal meine .bat Datei:

Find "backed_up_exchange_mailbox" *.xml >time.xls
Find "start_time" *.xml >>time.xls
pause

Mit *.xml werden halt alle XML Dateien, die in dem Verzeichnix liegen durchsucht.
Member: Biber
Biber May 09, 2006 at 10:47:42 (UTC)
Goto Top
For %%i in (*.xml) do (
Find "backed_up_exchange_mailbox" %%i>>time.xls  
Find "start_time" %%i>>time.xls)  

Hope that Helps

Biber
Mitglied: 20309
20309 May 09, 2006 at 11:34:15 (UTC)
Goto Top
Ok,

funktioniert bestens.
Danke !!!