Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: Drachenlady

Drachenlady (Level 1) - Jetzt verbinden

15.07.2013 um 16:16 Uhr, 1651 Aufrufe, 13 Kommentare

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!
Mitglied: Endoro
15.07.2013, aktualisiert 16.07.2013
Hallo,

kannst du mal testen:
01.
@ECHO OFF &SETLOCAL 
02.
SET "csv=liste.csv" 
03.
(FOR %%i IN (*.xml) DO ( 
04.
	FOR /f "tokens=1,2delims=<> " %%a IN ( 
05.
	'findstr "<InstdAmt> <BIC> <Nm> <IBAN> <Ustrd>" "%%~i"' 
06.
	) DO ( 
07.
		ECHO(%%a,%%b 
08.
09.
))>"%csv%" 
10.
TYPE "%csv%"
lg
Bitte warten ..
Mitglied: Drachenlady
16.07.2013 um 10:06 Uhr
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
Bitte warten ..
Mitglied: Endoro
16.07.2013, aktualisiert um 11:08 Uhr
Hallo,

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

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

lg
Bitte warten ..
Mitglied: Drachenlady
16.07.2013 um 14:17 Uhr
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
Bitte warten ..
Mitglied: Endoro
16.07.2013 um 15:17 Uhr
Hallo, es ist einfach, du setzt hier zwei "Tags" rein 1) < code> und 2) </code> (ohne Leerzeichen) und packst deine XML dazwischen.
Dann können wir besser erkennen, was Sache ist.

lg
Bitte warten ..
Mitglied: Drachenlady
16.07.2013 um 16:50 Uhr
Hier der Code:
01.
<PmtId> 
02.
<EndToEndId>1</EndToEndId> 
03.
</PmtId> 
04.
<Amt> 
05.
<InstdAmt Ccy="EUR">100.00</InstdAmt> 
06.
</Amt> 
07.
<CdtrAgt> 
08.
<FinInstnId> 
09.
<BIC>BIC</BIC> 
10.
</FinInstnId> 
11.
</CdtrAgt> 
12.
<Cdtr> 
13.
<Nm>Name, Vorname</Nm> 
14.
</Cdtr> 
15.
<CdtrAcct> 
16.
<Id> 
17.
<IBAN>DE999999999999999</IBAN> 
18.
</Id> 
19.
</CdtrAcct> 
20.
<Purp> 
21.
<Cd>GOVT</Cd> 
22.
</Purp> 
23.
<RmtInf> 
24.
<Ustrd>Verwendungszweck</Ustrd> 
25.
</RmtInf>
Bitte warten ..
Mitglied: Endoro
16.07.2013, aktualisiert um 17:14 Uhr
Hallo,

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

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

Dann könnte ich dir noch eine sed-Lösung anbieten:
01.
for %%i in (*.xml) do sed -nr "/<InstdAmt>|<BIC>|<Nm>|<IBAN>|<Ustrd>/s/<(.*)>(.*)<.*/\1,\2/p" "%%~i" > "liste.csv"
lg
Bitte warten ..
Mitglied: Drachenlady
16.07.2013 um 17:35 Uhr
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
Bitte warten ..
Mitglied: rubberman
16.07.2013 um 23:08 Uhr
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
Bitte warten ..
Mitglied: Drachenlady
17.07.2013 um 10:25 Uhr
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!
Bitte warten ..
Mitglied: Invisan
17.07.2013 um 10:34 Uhr
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
Bitte warten ..
Mitglied: Drachenlady
17.07.2013 um 13:35 Uhr
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
Bitte warten ..
Mitglied: Endoro
17.07.2013 um 16:46 Uhr
Hallo,

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

lg
Bitte warten ..
Ähnliche Inhalte
XML
gelöst Xml-Datei in eine csv-Datei umwandeln mit Powershell (5)

Frage von jan.kleinel zum Thema XML ...

XML
gelöst XML Datei mit Powershell splitten (2)

Frage von LianenSchwinger zum Thema XML ...

XML
XML Datei Fehler? (1)

Frage von Patrick-IT zum Thema XML ...

Neue Wissensbeiträge
Heiß diskutierte Inhalte
Windows Update
MS: Update-Server-Adressen OHNE Wildcards (16)

Frage von mrserious73 zum Thema Windows Update ...

Microsoft Office
+1.000 Ordner in Outlook: Wie besser? (10)

Frage von Matsushita zum Thema Microsoft Office ...

Router & Routing
gelöst Netzwerk am einfachsten trennen (8)

Frage von geheimagent zum Thema Router & Routing ...