ooalbert
Goto Top

XML Datei so konvertieren das der inhalt in eine XLS kann?

hi,

ich hab hier einen auszug aus einer XML datei in der diverse informationen stehe die ich gern in einer XLS datei hätte damit man die überhaupt weiterbenutzen kann face-smile

Mal als beispiel für die Relevanten daten:

<banklog dtab="" money="0" otab="0" player="Nullbull" rank="1" ts="1203019148000" type="2">  
        <item count="1" icon="inv_misc_gem_flamespessarite_02" id="23100" name="Glitzernder Flammenspessarit" qi="2" subtype="orange" type="gems"/>  
      </banklog>

das sind drei aufeinanderfolgende Zeilen wovon für mich die Position: money, player, ts, type, item count, id und name interessant sind.

in der XML datei sind natürlich haufenweise diese einträge die auch alle untereinander sind im selben format.

Jetzt dachte ich das eine Batch das vielleicht leisten kann und mir das als TXT zeilenweise zusammenschreibt das ich das dann nur noch in Exel importieren muß und die daten in einer tabelle hätte face-smile vielelicht auch als semikolon/komma getrennte CSV, da ich ja nur die werte in den hochkommas brauche.

Hat da wer eine idee wie man das am besten anstellen könnte?

Content-Key: 80859

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: ooAlbert
ooAlbert 16.02.2008 um 15:57:32 Uhr
Goto Top
ich hab mal bisschen rumprobiert:

echo off
for /f "tokens=2,4,6,7 delims=="  %%i in (test.txt) do  @ECHO %%i %%j %%k %%l  

pause

Das bring aber irgendwie nicht das gewünschte ergebnis.
aber von der logik her sollte das so gehen. jeder neue block beginnt mit einem "=", da ich das hochkomma nicht nehmen kann, weil der dann meint einen syntaxfehler zu haben. Und ich brauch block(token) 2-4-6-7
Wenn die anweisung mal nur für die erste zeile gilt.
da aus der zweiten zeile ich ja nut token 1-3-4 brauche
und die dritte zeile ignoriert werden kann. danach wiederholt sich dieses konstrukt ja wieder.
Mitglied: miniversum
miniversum 17.02.2008 um 11:28:35 Uhr
Goto Top
versuchs mal so:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

Set "infile=XMLdatei.xml"  
Set "outfile=XLSdatei.csv"  

set nr=1
echo money;player;ts;type;item count;id;name>"%outfile%"  

FOR /F "usebackq  delims=" %%i in ("%infile%") do (  
  set line=%%i
  set line=!line:^<=!
  set line=!line:^>=!

  if [!nr!] equ [3] (
    echo !money!;!player!;!ts!;!type!;!itemcount!;!id!;!name!>>"%outfile%"  
    set nr=1
  )
  if [!nr!] equ [2] (
    FOR /F "tokens=3,7 delims== " %%a in ('echo !line!') do set "itemcount=%%~a" & set "id=%%~b"  
    FOR /F "tokens=5 delims==" %%a in ('echo !line!') do set "name=%%~a"  
    set name=!name:~0,-4!
    set nr=3
  )

  if [!nr!] equ [1] (
    FOR /F "tokens=5,9,13,15 delims== " %%a in ('echo !line!') do set "money=%%~a" & set "player=%%~b" & set "ts=%%~c" & set "type=%%~d"  
    set nr=2
  )
)
miniversum
Mitglied: ooAlbert
ooAlbert 18.02.2008 um 09:51:56 Uhr
Goto Top
ich hab das mal ausprobiert das macht schon eher das was ich wollte face-smile nur scheint die Batch irgendwie in eine endlosschleife zu verfallen, ich brech die nach ner weile immer ab und es erzeugt trotzdem die CSV.


Ich hab gerade gesehen das die Datei doch nicht ganz so homogen ist wie gedacht:
<banklog dtab="" money="200000" otab="" player="Nullbull" rank="1" ts="1203019273000" type="4"/>  
      <banklog dtab="" money="0" otab="0" player="Nullbull" rank="1" ts="1203019150000" type="2">  
        <item count="1" icon="inv_misc_gem_flamespessarite_02" id="23100" name="Glitzernder Flammenspessarit" qi="2" subtype="orange" type="gems"/>  
      </banklog>

vermutlich müßte man abprüfen können ob nach der zeile mit dem beginn "<banklog" eine Zeile mit begin "<item" kommt und wenn nicht die Routine eine neue Zeile für die CSV abarbeitet. denn das was in "<item" steht soll ja eh in der CSV an die zeile angefügt werden vom vorherigen"<banklog"

Beispiel:
200000, Nullbull, 1203019273000, 4
0, Nullbull, 1203019150000, 2, 1, 23100, Glitzernder Flammenspessarit
...
Mitglied: miniversum
miniversum 18.02.2008 um 11:23:35 Uhr
Goto Top
Ja der Automat den ich Programmiert hatte geht davon aus das immer die Drei Zeilen genau so aufeinander Folgen.
Schau mal obs damit geht:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

Set "infile=XMLdatei.xml"  
Set "outfile=XLSdatei.csv"  

set nr=1
echo money;player;ts;type;item count;id;name>"%outfile%"  

FOR /F "usebackq  delims=" %%i in ("%infile%") do (  
  set line=%%i
  set line=!line:^<=!
  set line=!line:^>=!

  if [!nr!] equ [3] (
    echo !money!;!player!;!ts!;!type!;!itemcount!;!id!;!name!>>"%outfile%"  
    set nr=1
  )

  if [!nr!] equ [2] (
    FOR /F "tokens=1,3,7 delims== " %%a in ('echo !line!') do (  
      if [%%~a] equ [item] (
        set "itemcount=%%~b" & set "id=%%~c"  
        FOR /F "tokens=5 delims==" %%a in ('echo !line!') do set "name=%%~a"  
        set name=!name:~0,-4!
        set nr=3
      ) else (
        echo !money!;!player!;!ts!;!type!>>"%outfile%"  
        set nr=1
      )
    )
  )

  if [!nr!] equ [1] (
    FOR /F "tokens=5,9,13,15 delims== " %%a in ('echo !line!') do set "money=%%~a" & set "player=%%~b" & set "ts=%%~c" & set "type=%%~d"  
    set nr=2
  )
)
miniversum
Mitglied: ooAlbert
ooAlbert 18.02.2008 um 14:35:24 Uhr
Goto Top
son mist jetzt ist mir das Posting verschwunden face-smile

money;player;ts;type;item count;id;name
money;player;ts;type
0;Nullbull;1203019150000;2;1;23100;Glitzernder Flammenspessarit
0;Nullbull;1203019150000;2
0;Nullbull;1203019148000;2;1;23100;Glitzernder Flammenspessarit
0;Nullbull;1203019148000;2
0;Adorinaa;1203017007000;1;6;25802;Schreckensgiftbeutel
0;Adorinaa;1203017007000;1
0;Adorinaa;1203016974000;2;1;27499;Rolle der Intelligenz V
0;Adorinaa;1203016974000;2
0;Adorinaa;1203016963000;1;1;27498;Rolle der Beweglichkeit V
0;Adorinaa;1203016963000;1
...
300000;Adorinaa;1201790140000;4"/  
100000;Salome;1201235764000;4"/  
200000;Bizzel;1201215842000;4"/  
...

an sich klappt das jetzt, bis auf das die zeilen zweimal erscheinen und die allererste zeile ignoriert wird. Bei der einen transaktion hab ich halt statt der 4 noch das ""/" dabei, kann aber daran leigen das da mehrfach nur einzeilige logeinträge waren face-smile


<banklog dtab="" money="200000" otab="" player="Nullbull" rank="1" ts="1203019273000" type="4"/>  

...

<banklog dtab="" money="300000" otab="" player="Adorinaa" rank="3" ts="1201790140000" type="4"/>  
      <banklog dtab="" money="100000" otab="" player="Salome" rank="1" ts="1201235764000" type="4"/>  
      <banklog dtab="" money="200000" otab="" player="Bizzel" rank="1" ts="1201215842000" type="4"/>  
      <banklog dtab="" money="0" otab="0" player="Poisenive" rank="1" ts="1200867904000" type="2">  
        <item count="5" icon="inv_potion_137" id="22832" name="Erstklassiger Manatrank" qi="1" subtype="" type="consumables"/>  
      </banklog>

...
Mitglied: miniversum
miniversum 18.02.2008 um 14:49:30 Uhr
Goto Top
Versuch das mal:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

Set "infile=XMLdatei.xml"  
Set "outfile=XLSdatei.csv"  

set nr=1
echo money;player;ts;type;item count;id;name>"%outfile%"  

FOR /F "usebackq  delims=" %%i in ("%infile%") do (  
  set line=%%i
  set line=!line:^<=!
  set line=!line:^>=!

  if [!nr!] equ [3] (
    echo !money!;!player!;!ts!;!type!;!itemcount!;!id!;!name!>>"%outfile%"  
    set nr=1
  )

  if [!nr!] equ [2] (
    FOR /F "tokens=1,3,7 delims== " %%a in ('echo !line!') do set "typ=%%~a" & set "itemcount=%%~b" & set "id=%%~c"  
    if [!typ!] equ [item] (
      FOR /F "tokens=5 delims==" %%a in ('echo !line!') do set "name=%%~a"  
      set name=!name:~0,-4!
      set nr=3
    ) else (
      echo !money!;!player!;!ts!;!type!>>"%outfile%"  
      set nr=4
    )
  )

  if [!nr!] equ [1] (
    FOR /F "tokens=5,9,13,15 delims== " %%a in ('echo !line!') do set "money=%%~a" & set "player=%%~b" & set "ts=%%~c" & set "type=%%~d"  
    set nr=2
  )

  if [!nr!] equ [4] (
    set nr=1
  )
)
Mitglied: ooAlbert
ooAlbert 18.02.2008 um 14:57:57 Uhr
Goto Top
das sieht dann jetzt so aus:

money;player;ts;type;item count;id;name
money;player;ts;type
inv_misc_gem_flamespessarite_02;Glitzernder;subtype;type
0;Nullbull;1203019148000;2;1;23100;Glitzernder Flammenspessarit
0;Nullbull;1203019148000;2
inv_misc_organ_04;Schreckensgiftbeutel;;consumables"/  
0;Adorinaa;1203016974000;2;1;27499;Rolle der Intelligenz V
0;Adorinaa;1203016974000;2
inv_scroll_02;Rolle;qi;subtype
0;Zere;1202912372000;2;1;15763;Muster: Blaue Drachenschuppenschultern
0;Zere;1202912372000;2
inv_fabric_purplefire_01;Runenstoff;;tradegoods"/  
0;Crüxshadows;1202899204000;2;19;21877;Netherstoff
0;Crüxshadows;1202899204000;2
...

Achso das script bleibt in der endlosschleife hängen.
Mitglied: miniversum
miniversum 18.02.2008 um 16:59:37 Uhr
Goto Top
So Ich hab die ganze Verarbeitung nochmal neu aufgebaut und getestet.
So sollte es gehen:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

Set "infile=XMLdatei.xml"  
Set "outfile=XLSdatei.csv"  

set "lines="  
if exist "%outfile%" del "%outfile%"  

FOR /F "usebackq  delims=" %%i in ("%infile%") do (  

  set line=%%i
  set line=!line:^<=!
  set line=!line:/^>=!
  set line=!line:^>=!

  FOR /F "tokens=1 delims= " %%a in ('echo !line!') do set "typ=%%~a"  

  if [!typ!] equ [banklog] (
    if [!lines!] equ [1] echo !money!;!player!;!ts!;!type!>>"%outfile%"  
    FOR /F "tokens=5,9,13,15 delims== " %%a in ('echo !line!') do set "money=%%~a" & set "player=%%~b" & set "ts=%%~c" & set "type=%%~d"  
    set "lines=1"  
  )

  if [!typ!] equ [item] (
    FOR /F "tokens=3,7,9,13,15 delims== " %%a in ('echo !line!') do set "itemcount=%%~a" & set "id=%%~b"  
    FOR /F "tokens=5 delims==" %%a in ('echo !line!') do set "name=%%~a"  
    set name=!name:~0,-4!
    set "lines=3"  
  )

  if [!typ!] equ [/banklog] (
    echo !money!;!player!;!ts!;!type!;!itemcount!;!id!;!name!>>"%outfile%"  
    set "lines=1"  
  )

)

miniversum
Mitglied: ooAlbert
ooAlbert 18.02.2008 um 19:56:44 Uhr
Goto Top
ich hab das gerade getestet, das script läuft jetzt durch. die erste zeile ist aber immernoch ignoriert und die zeilen sind noch doppelt ansinsten sieht es super aus.

0;Nullbull;1203019150000;2;1;23100;Glitzernder Flammenspessarit
0;Nullbull;1203019150000;2
0;Nullbull;1203019148000;2;1;23100;Glitzernder Flammenspessarit
0;Nullbull;1203019148000;2
0;Adorinaa;1203017007000;1;6;25802;Schreckensgiftbeutel
0;Adorinaa;1203017007000;1
0;Adorinaa;1203016974000;2;1;27499;Rolle der Intelligenz V
0;Adorinaa;1203016974000;2
0;Adorinaa;1203016963000;1;1;27498;Rolle der Beweglichkeit V
0;Adorinaa;1203016963000;1

ich würd dir ja die XML auch mal schicken falls das was nutzt aber hier kann man irgendwie nichts anhängen.
Mitglied: miniversum
miniversum 18.02.2008 um 21:14:54 Uhr
Goto Top
Also bei mir läufts problemlos.
miniversum