Batch textzeile einfügen
Guten Tag alle zusammen,
ich habe mal wieder ein Problem das mittels einer Batch-Datei gelöst werden kann/soll/muss.
Es besteht folgende Herausforderung:
Einer bestehenden XML-Datei die in etwa folgende Struktur hat:
<Herkunfts-ID>??</Herkunfts-ID>
<Benutzer>??</Benutzer>
<anrede>??</anrede>
<name>??</name>
<vorname>??</vorname>
<plz>??</plz>
<ort>??</ort>
<land>??</land>
<staatsang>??</staatsang>
<ausweisnr />
<anreise>??</anreise>
<abreise>??</abreise>
<kategorie>??</kategorie>
<Herkunfts-ID>??</Herkunfts-ID>
<Benutzer>??</Benutzer>
..
soll unter der Zeile <ort>??</ort> eine weitere Zeile hinzugefügt werden <str>.</str>
nach meinen bisherigen Bemühungen und etlichen Stunden der Suche in diversen Foren und mittels Google sieht mein bisheriges Skript wie folgt aus
@echo off > new.xml
setLocal EnableDelayedExpansion
set source=quelle.xml
set target=ziel.xml
for /f "tokens=1 delims=" %%a in ('find /n "*ort>" ^< %source%') do (
set /a i=%%a
set /a i-=1
)
for /f "tokens=* delims= " %%a in (%source%) do (
echo %%a >> %target%
set /a n+=1
if !i! equ !n! echo "<str>.</str>" >> %target%
)
Damit wird die Ausgangsdatei ohne Veränderungen in die Zieldatei geschrieben, die gewünschte Veränderung wird nicht durchgeführt.
Ich hoffe das mir jemand verraten kann an welcher Stelle der Fehler liegt bzw. ob ich den völlig falschen Ansatz verfolgt habe.
PS: Die Ausgangsdatei enthält mehrere hundert dieser Einträge und wird täglich generiert - deshalb ist die Lösung über ein Skript notwendig.
ich habe mal wieder ein Problem das mittels einer Batch-Datei gelöst werden kann/soll/muss.
Es besteht folgende Herausforderung:
Einer bestehenden XML-Datei die in etwa folgende Struktur hat:
<Herkunfts-ID>??</Herkunfts-ID>
<Benutzer>??</Benutzer>
<anrede>??</anrede>
<name>??</name>
<vorname>??</vorname>
<plz>??</plz>
<ort>??</ort>
<land>??</land>
<staatsang>??</staatsang>
<ausweisnr />
<anreise>??</anreise>
<abreise>??</abreise>
<kategorie>??</kategorie>
<Herkunfts-ID>??</Herkunfts-ID>
<Benutzer>??</Benutzer>
..
soll unter der Zeile <ort>??</ort> eine weitere Zeile hinzugefügt werden <str>.</str>
nach meinen bisherigen Bemühungen und etlichen Stunden der Suche in diversen Foren und mittels Google sieht mein bisheriges Skript wie folgt aus
@echo off > new.xml
setLocal EnableDelayedExpansion
set source=quelle.xml
set target=ziel.xml
for /f "tokens=1 delims=" %%a in ('find /n "*ort>" ^< %source%') do (
set /a i=%%a
set /a i-=1
)
for /f "tokens=* delims= " %%a in (%source%) do (
echo %%a >> %target%
set /a n+=1
if !i! equ !n! echo "<str>.</str>" >> %target%
)
Damit wird die Ausgangsdatei ohne Veränderungen in die Zieldatei geschrieben, die gewünschte Veränderung wird nicht durchgeführt.
Ich hoffe das mir jemand verraten kann an welcher Stelle der Fehler liegt bzw. ob ich den völlig falschen Ansatz verfolgt habe.
PS: Die Ausgangsdatei enthält mehrere hundert dieser Einträge und wird täglich generiert - deshalb ist die Lösung über ein Skript notwendig.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 165571
Url: https://administrator.de/forum/batch-textzeile-einfuegen-165571.html
Ausgedruckt am: 27.12.2024 um 03:12 Uhr
15 Kommentare
Neuester Kommentar
moin,
ich machs kurz:
btw:
Gruß
btw²
Nein - denn eine Strasse nach dem Ort ist alles andere als unüblich, der Verseuursacher der die xml erstellt soll das machen
ich machs kurz:
- @echo off in Betaphasenbatcheln, mag ich überhaupt nicht
- <code> </code> Blöcke aber sehr wohl
- Die suchfunktion mit batch xml zeile zu füttern, darfst du dann wieder.
btw:
echo %%a >> du weißt schon das das zeichen hinter %a auch in der gepipten Datei landet?
Gruß
btw²
PS: Die Ausgangsdatei enthält mehrere hundert dieser Einträge und wird täglich generiert - deshalb ist die Lösung über ein Skript notwendig.
Nein - denn eine Strasse nach dem Ort ist alles andere als unüblich, der Ver
Hallo hoomer,
folgender Code sollte Dir helfen:
Die Zieldatei wird in Zeile 6 erstmal geleert.
Das Script ließt die Quelldatei Zeile für Zeile ein und schreibt in Zeile 9 jede eingelesene Zeile in die Zieldatei. Wenn die zuletzt gelesene/geschriebene Zeile den String
In der Quelldatei vorhandene Leerzeilen werden in die Zieldatei übernommen.
Wenn Du noch weitere Fragen bzgl. der Funktionsweise hast, lass hören.
Gruß
Friemler
P.S.
Zeile 6 kann eigentlich auch weggelassen werden, da die Zieldatei sowieso einfach überschrieben wird.
[EDIT]
Script auf bastlas Vorschlag hin geändert (s.u.)
[/EDIT]
folgender Code sollte Dir helfen:
@echo off & setlocal
set "source=quelle.xml"
set "dest=ziel.xml"
type NUL > "%dest%"
(for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%source%"') do (
<NUL set /p "=%%b" & echo.
<NUL set /p "=%%b" | find /i "<ort>" > NUL && (<NUL set /p "=<str>.</str>" & echo.)
)) > "%dest%"
Die Zieldatei wird in Zeile 6 erstmal geleert.
Das Script ließt die Quelldatei Zeile für Zeile ein und schreibt in Zeile 9 jede eingelesene Zeile in die Zieldatei. Wenn die zuletzt gelesene/geschriebene Zeile den String
<ort>
enthält (Groß-/Kleinschreibung egal), wird zusätzlich in Zeile 10 noch <str>.</str>
in die Zieldatei geschrieben.In der Quelldatei vorhandene Leerzeilen werden in die Zieldatei übernommen.
Wenn Du noch weitere Fragen bzgl. der Funktionsweise hast, lass hören.
Gruß
Friemler
P.S.
Zeile 6 kann eigentlich auch weggelassen werden, da die Zieldatei sowieso einfach überschrieben wird.
[EDIT]
Script auf bastlas Vorschlag hin geändert (s.u.)
[/EDIT]
@Friemler
Nachdem ich vorher nur kurz zum Drüberlesen Zeit hatte, war ich bei der ziemlich gleichen Struktur wie Du gelandet - allerdings hätte ich nicht Deine elegante "delayedExpansion"-Vermeidungs-Strategie verwendet ...
Noch eine kleine Anmerkung:
Jede, auch die letzte, Zeile hat einen Anfang, aber nicht jede (nämlich gelegentlich die letzte) Zeile auch ein "Ende" - daher würde ich "$" durch "^" ersetzen.
Grüße
bastla
Nachdem ich vorher nur kurz zum Drüberlesen Zeit hatte, war ich bei der ziemlich gleichen Struktur wie Du gelandet - allerdings hätte ich nicht Deine elegante "delayedExpansion"-Vermeidungs-Strategie verwendet ...
Noch eine kleine Anmerkung:
Jede, auch die letzte, Zeile hat einen Anfang, aber nicht jede (nämlich gelegentlich die letzte) Zeile auch ein "Ende" - daher würde ich "$" durch "^" ersetzen.
Grüße
bastla
Hallo bastla,
ist sinnvoll und auch schon erledigt .
Gruß
Friemler
ist sinnvoll und auch schon erledigt .
Gruß
Friemler
@Friemler
Sorry, hatte vorhin nicht extra auf die Anführungszeichen, die für "
Grüße
bastla
Sorry, hatte vorhin nicht extra auf die Anführungszeichen, die für "
^
" (nicht aber für $
) benötigt werden, hingewiesen ... Grüße
bastla
Hi bastla,
das kam mir gerade auch in den Sinn, habe mich deshalb extra noch mal eingeloggt... Trotzdem Danke.
Gruß
Friemler
Zitat von @bastla:
hatte vorhin nicht extra auf die Anführungszeichen, die für "
hatte vorhin nicht extra auf die Anführungszeichen, die für "
^
" (nicht aber für $
) benötigt werden, hingewiesen ...das kam mir gerade auch in den Sinn, habe mich deshalb extra noch mal eingeloggt... Trotzdem Danke.
Gruß
Friemler
Hallo hoomer!
Wenn Du nicht so viel Zeit dafür hättest, würde ich eher zu VBS raten - ungetestet:
Grüße
bastla
Wenn Du nicht so viel Zeit dafür hättest, würde ich eher zu VBS raten - ungetestet:
Ein = "quelle.xml"
Aus = "ziel.xml"
Neu = "<str>.</str>"
Set fso = CreateObject("Scripting.FileSystemObject")
Set rE = New RegExp
rE.Global = True
rE.Pattern = "(<ort>.*</ort>)"
T = fso.OpenTextFile(Ein).ReadAll
fso.CreateTextFile(Aus).Write rE.Replace(T, "$1" & vbCrLf & Neu)
bastla
Hallo hoomer!
Soferne VBS doch eine Option sein sollte, müsste nur die Zeile 10 durch
ersetzt werden.
Grüße
bastla
P.S.: Egal, ob CMD oder VBS - mit ""-Formatierung (lässt sich auch nachträglich noch einfügen ) wird's besser lesbar ...
Soferne VBS doch eine Option sein sollte, müsste nur die Zeile 10 durch
T = Replace(Replace(fso.OpenTextFile(Ein).ReadAll, ":", "."), ",", ".")
Grüße
bastla
P.S.: Egal, ob CMD oder VBS - mit ""-Formatierung (lässt sich auch nachträglich noch einfügen ) wird's besser lesbar ...
Hallo Hoomer,
freut mich, dass ich Dir helfen konnte.
Allerdings kommen mir 10 Minuten für 100 Datensätze sehr lange vor. Auf meinem System (Intel Core i5 Quadcore-CPU auf 2,8 GHz, 4GB RAM, Windows 7 Ultimate 32Bit) sind 200 Datensätze in 37 Sekunden verarbeitet. Ihr scheint ja einen ziemlich alten Rechner in Eurem Hotel zu haben .
Du solltest deshalb evtl. bastlas Rat befolgen, und ein VBScript verwenden. Da wäre die Ersetzung von Doppelpunkten und Kommas auch viel einfacher (und schneller). Ich erweitere hier mal bastlas Code:
Dann sind meine 200 Test-Datensätze in ca. 0,5 Sekunden verarbeitet.
Gruß
Friemler
[EDIT]
Oh, da war der bastla wieder schneller!
[/EDIT]
freut mich, dass ich Dir helfen konnte.
Allerdings kommen mir 10 Minuten für 100 Datensätze sehr lange vor. Auf meinem System (Intel Core i5 Quadcore-CPU auf 2,8 GHz, 4GB RAM, Windows 7 Ultimate 32Bit) sind 200 Datensätze in 37 Sekunden verarbeitet. Ihr scheint ja einen ziemlich alten Rechner in Eurem Hotel zu haben .
Du solltest deshalb evtl. bastlas Rat befolgen, und ein VBScript verwenden. Da wäre die Ersetzung von Doppelpunkten und Kommas auch viel einfacher (und schneller). Ich erweitere hier mal bastlas Code:
Ein = "quelle.xml"
Aus = "ziel.xml"
Neu = "<str>.</str>"
Set fso = CreateObject("Scripting.FileSystemObject")
Set rE = New RegExp
rE.Global = True
rE.Pattern = "(<ort>.*</ort>)"
T = fso.OpenTextFile(Ein).ReadAll
T = rE.Replace(T, "$1" & vbCrLf & Neu)
rE.Pattern = ":|,"
T = rE.Replace(T, ".")
fso.CreateTextFile(Aus).Write T
Dann sind meine 200 Test-Datensätze in ca. 0,5 Sekunden verarbeitet.
Gruß
Friemler
[EDIT]
Oh, da war der bastla wieder schneller!
[/EDIT]
@Friemler
Grüße
bastla
Oh, da war der bastla wieder schneller!
Dafür hast Du aber die wesentlich übersichtlichere Version geliefert ... Grüße
bastla
Hallo Hoomer,
also bei mir macht das Script beides, die Zeile
Gruß
Friemler
[EDIT]
Um Fehler beim Abtippen bzw. Copy&Paste-Fehler zu vermeiden, kannst Du auf das Wort
[/EDIT]
also bei mir macht das Script beides, die Zeile
<str>.</str>
einfügen und Doppelpunkte und Kommas ersetzen. Dass das Einfügen der Zeile mit der Straße bei Dir nicht funktioniert, könnte daran liegen, dass in Deiner XML-Datei die Zeile mit dem Ort sich in der Groß-/Kleinschreibung von <ort>xxx</ort>
unterscheidet. In dem Fall müsstest Du nach rE.Global = True
in Zeile 7 als neue Zeile 8 rE.IgnoreCase = True
einfügen.Gruß
Friemler
[EDIT]
Um Fehler beim Abtippen bzw. Copy&Paste-Fehler zu vermeiden, kannst Du auf das Wort
Quelltext
am rechten oberen Rand der Box mit dem Script klicken. Der Code erscheint dann in einem neuen Fenster. In dieses Fenster klicken und CTRL+A
drücken, dann wird alles selektiert. Dann CTRL+C
und Du hast den Quelltext in der Zwischenablage. Dann kannst Du ihn im Fenster eines Texteditors mit CTRL+V
einfügen und als VBS-Datei speichern.[/EDIT]