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-Key: 211517

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

Printed on: April 26, 2024 at 17:04 o'clock

Member: Endoro
Endoro Jul 15, 2013, updated at Jul 16, 2013 at 09:07:28 (UTC)
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
Member: Drachenlady
Drachenlady Jul 16, 2013 at 08:06:55 (UTC)
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
Member: Endoro
Endoro Jul 16, 2013 updated at 09:08:41 (UTC)
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
Member: Drachenlady
Drachenlady Jul 16, 2013 at 12:17:51 (UTC)
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
Member: Endoro
Endoro Jul 16, 2013 at 13:17:36 (UTC)
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
Member: Drachenlady
Drachenlady Jul 16, 2013 at 14:50:45 (UTC)
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>
Member: Endoro
Endoro Jul 16, 2013 updated at 15:14:26 (UTC)
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
Member: Drachenlady
Drachenlady Jul 16, 2013 at 15:35:24 (UTC)
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
Member: rubberman
rubberman Jul 16, 2013 at 21:08:14 (UTC)
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
Member: Drachenlady
Drachenlady Jul 17, 2013 at 08:25:56 (UTC)
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!
Member: Invisan
Invisan Jul 17, 2013 at 08:34:40 (UTC)
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
Member: Drachenlady
Drachenlady Jul 17, 2013 at 11:35:42 (UTC)
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
Member: Endoro
Endoro Jul 17, 2013 at 14:46:55 (UTC)
Goto Top
Hallo,

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

lg