drachenlady
Goto Top

Sehr große XML-Datei nach bestimmten Tag durchsuchen und in Textdatei speichern

Hallo Forum,
da ich leider nicht mit einer Aufgabenlösung weiterkomme, wende ich mich an Euch in der Hoffnung, dass mir jemand einen Tipp geben kann.
Hier die Aufgabenbeschreibung:
Ziel ist es, aus einer XML-Datei bestimmte Inhalte von Zahlungsangaben mittels Batch in eine Text-/CSV-Datei zu extrahieren.
Die Datei befindet sich als einzige XML-Datei in diesem Verzeichnis (immer).
Das Problem dabei ist, dass die XML-Datei sehr groß ist und dann nicht nur die gesuchten Inhalte in der Datei vorhanden sind.
Die gesuchten Inhalte befinden sich jedoch immer in den gleichlautenden Tags und immer in der gleichen Reihenfolge.
Beispiel:
<PmtId>
<EndToEndId>1</EndToEndId>
</PmtId>
<Amt>
<InstdAmt Ccy="EUR">100.00</InstdAmt>
</Amt>
<CdtrAgt>
<FinInstnId>
<BIC>BIC</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Name, Vorname</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE999999999999999</IBAN>
</Id>
</CdtrAcct>
<Purp>
<cd>GOVT</cd>
</Purp>
<RmtInf>
<Ustrd>Verwendungszweck</Ustrd>
</RmtInf>
Soweit das Beispiel.
Hier nun der Versuch, dem Ganzen auf die Batch-Sprünge zu helfen:

@echo off & setlocal
set pfad=C:\ATEST\
set "CSV1=Liste.csv"


REM Liste erstellen

pushd "%pfad%"
for /f "delims=" %%i in ('dir /s /b *.xml') do call :ProcessFile "%%i"
popd
goto :eof

:ProcessFile
set "Record="
for %%f in ("<InstdAmt>" "<BIC>" "<Nm>" "<IBAN>" "<Ustrd>") do for /f "tokens=5 delims=<>" %%v in ('findstr %%f %1') do call

:ProcessField %%v
"%CSV1%" echo %Record:~1%
goto :eof

:ProcessField
set Record=%Record%%1%Delim%
goto :eof

echo

Das Ergebnis ist, dass die Datei "Liste.csv" angelegt wird, jedoch in den Excel-Feldern A1 und A2 jeweils ~1 als Inhalt eingetragen wird.

PS:
Vorab - sorry für die schon ähnlichen im Forum vorhandenen Fragen, bei denen ich jedoch leider nicht so richtig fündig geworden bin (vielleicht lag´s ja auch am heutigen geistigen Montagsdilemma...)

Für ´nen Tipp wäre ich echt dankbar, weil ich momentan net so richtig checke, auf welcher Leitung ich eigentlich gerade herumstehe!

Content-ID: 211517

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

Endoro
Endoro 15.07.2013, aktualisiert am 16.07.2013 um 11:07:28 Uhr
Goto Top
Hallo,

kannst du mal testen:
@ECHO OFF &SETLOCAL
SET "csv=liste.csv"  
(FOR %%i IN (*.xml) DO (
	FOR /f "tokens=1,2delims=<> " %%a IN (  
	'findstr "<InstdAmt> <BIC> <Nm> <IBAN> <Ustrd>" "%%~i"'  
	) DO (
		ECHO(%%a,%%b
	)
))>"%csv%"  
TYPE "%csv%"  

lg
Drachenlady
Drachenlady 16.07.2013 um 10:06:55 Uhr
Goto Top
Hallo Endoro,
vielen Dank für die schnelle Antwort -
nur leider hat es nicht gepgeht, es werden die Tag-Bezeichnungen in das csv-File geschrieben, nicht deren Inhalte, also bastle ich noch ´n bisschen weiter...
Gruß Drachenlady
Endoro
Endoro 16.07.2013 aktualisiert um 11:08:41 Uhr
Goto Top
Hallo,

dann solltest du dein XML file noch mal ordentlich in tags verpackt veröffentlichen.

Wahrscheinlich hast du leading white space drinnen.
[€]Ich habs mal dahingehend geändert, versuchs noch mal.[/€]

lg
Drachenlady
Drachenlady 16.07.2013 um 14:17:51 Uhr
Goto Top
Hallo Endoro,
danke für die Rückantwort, die ich nicht wirklich verstehe.
Leerzeichen kann ich nicht ausschließen, dass ist richtig, Zeilenumbrüche gibt es nicht.
Die Änderung, von der Du sprichst sehe ich nicht und der Code oben ist original und in Fortsetzung des obigen Auszuges ginge es sequentiell codseitig genau so weiter, nur eben inhaltlich nicht.
Wie gesagt, leider verstehe ich Deine Ausführungen nicht wirklich, könntest Du mir dabei vielleicht noch einmal auf die geistigen Sprünge helfen?
Viele Grüße
Drachenlady
Endoro
Endoro 16.07.2013 um 15:17:36 Uhr
Goto Top
Hallo, es ist einfach, du setzt hier zwei "Tags" rein 1) < code> und 2) (ohne Leerzeichen) und packst deine XML dazwischen.
Dann können wir besser erkennen, was Sache ist.

lg
Drachenlady
Drachenlady 16.07.2013 um 16:50:45 Uhr
Goto Top
Hier der Code:
<PmtId>
<EndToEndId>1</EndToEndId>
</PmtId>
<Amt>
<InstdAmt Ccy="EUR">100.00</InstdAmt>  
</Amt>
<CdtrAgt>
<FinInstnId>
<BIC>BIC</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Name, Vorname</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE999999999999999</IBAN>
</Id>
</CdtrAcct>
<Purp>
<cd>GOVT</cd>
</Purp>
<RmtInf>
<Ustrd>Verwendungszweck</Ustrd>
</RmtInf>
Endoro
Endoro 16.07.2013 aktualisiert um 17:14:26 Uhr
Goto Top
Hallo,

führende Leerzeichen sind nicht in der XML-Datei.
Kommt sie von einem Unix/Mac-Rechner?

@ECHO OFF &SETLOCAL
SET "csv=liste.csv"  
(FOR %%i IN (*.xml) DO (
	FOR /f "tokens=1,2delims=<>" %%a IN (  
	'findstr "<InstdAmt> <BIC> <Nm> <IBAN> <Ustrd>" "%%~i"'  
	) DO (
		ECHO(%%a,%%b
	)
))>"%csv%"  
TYPE "%csv%"  
Das läuft bei mir ohne Probleme durch.

Dann könnte ich dir noch eine sed-Lösung anbieten:
for %%i in (*.xml) do sed -nr "/<InstdAmt>|<BIC>|<Nm>|<IBAN>|<Ustrd>/s/<(.*)>(.*)<.*/\1,\2/p" "%%~i" > "liste.csv"  

lg
Drachenlady
Drachenlady 16.07.2013 um 17:35:24 Uhr
Goto Top
Hallo Endoro,
nein die Datei hat ihren Ursprung von einen WINDOWS-Rechner und die sed-Lösung versuche ich auch noch - Dankeschön!
Gruß
Drachenlady
rubberman
rubberman 16.07.2013 um 23:08:14 Uhr
Goto Top
Hallo Drachenlady.

Zeilenumbrüche gibt es nicht.
... würde nicht zu deinem geposteten Quelltext passen und wäre ein Ausschlusskriterium für die Verwendung von Batch.

Grüße
rubberman
Drachenlady
Drachenlady 17.07.2013 um 10:25:56 Uhr
Goto Top
Hallo Endoro,
der Test der "sed"-Lösung ergibt folgende Ausschrift:
Der Befehl "sed" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Die Eingabe von sed /? in der Commandozeile ergibt die gleiche "Absage".
Wass sollte der Befehl den bewirken?
Noch ´n Tipp dazu?
Danke vorab!
Invisan
Invisan 17.07.2013 um 10:34:40 Uhr
Goto Top
Zitat von @Drachenlady:
Hallo Endoro,
der Test der "sed"-Lösung ergibt folgende Ausschrift:
Der Befehl "sed" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Die Eingabe von sed /? in der Commandozeile ergibt die gleiche "Absage".
Wass sollte der Befehl den bewirken?
Noch ´n Tipp dazu?
Danke vorab!

Hallo Drachenlady,

sed ist ein standardmäßiger Linux Befehl und kann daher auch nicht ohne weiteres gehen.
Mir wäre allerdings auch nicht bekannt das es sed für Windows gibt.

Mfg Invisan
Drachenlady
Drachenlady 17.07.2013 um 13:35:42 Uhr
Goto Top
Hallo Invisan,
herzlichen Dank für den Tipp!
Ich wühle mich mal durch die Foren, ob es etwas analoges für WINDOWS gibt...
Grüße
Drachenlady
Endoro
Endoro 17.07.2013 um 16:46:55 Uhr
Goto Top
Hallo,

sed wird von Windows standardmässig leider nicht installiert.
Kannst du hier bekommen.

lg