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
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!
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%
: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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 211517
Url: https://administrator.de/contentid/211517
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo,
führende Leerzeichen sind nicht in der XML-Datei.
Kommt sie von einem Unix/Mac-Rechner?
Das läuft bei mir ohne Probleme durch.
Dann könnte ich dir noch eine
lg
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%"
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
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 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