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
GELÖST

Batch textzeile einfügen

Frage Entwicklung Batch & Shell

Mitglied: hoomer

hoomer (Level 1) - Jetzt verbinden

03.05.2011, aktualisiert 04.05.2011, 10341 Aufrufe, 15 Kommentare

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.
Mitglied: 60730
03.05.2011 um 15:12 Uhr
moin,

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 Verseuursacher der die xml erstellt soll das machen
Bitte warten ..
Mitglied: Friemler
03.05.2011 um 15:29 Uhr
Hallo hoomer,

folgender Code sollte Dir helfen:
01.
@echo off & setlocal 
02.
 
03.
set "source=quelle.xml" 
04.
set "dest=ziel.xml" 
05.
 
06.
type NUL > "%dest%" 
07.
 
08.
(for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%source%"') do ( 
09.
  <NUL set /p "=%%b" & echo. 
10.
  <NUL set /p "=%%b" | find /i "<ort>" > NUL && (<NUL set /p "=<str>.</str>" & echo.) 
11.
)) > "%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]
Bitte warten ..
Mitglied: bastla
03.05.2011 um 17:09 Uhr
@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
Bitte warten ..
Mitglied: Friemler
03.05.2011 um 18:04 Uhr
Hallo bastla,

Zitat von bastla:
... daher würde ich "$" durch "^" ersetzen.

ist sinnvoll und auch schon erledigt .

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
03.05.2011 um 18:24 Uhr
@Friemler
Sorry, hatte vorhin nicht extra auf die Anführungszeichen, die für "^" (nicht aber für $) benötigt werden, hingewiesen ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
03.05.2011 um 20:42 Uhr
Hi bastla,

Zitat von bastla:
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
Bitte warten ..
Mitglied: hoomer
04.05.2011 um 09:09 Uhr
Danke. funktioniert gut - auch wenn das Skript von Friemler für ca 100 Datensätze ungefähr 10 Minuten läuft, aber wenn ich das in der Nacht als Task laufen lasse passt das schon.

Vielen dank

Hoomer
Bitte warten ..
Mitglied: bastla
04.05.2011 um 11:35 Uhr
Hallo hoomer!

Wenn Du nicht so viel Zeit dafür hättest, würde ich eher zu VBS raten - ungetestet:
01.
Ein = "quelle.xml" 
02.
Aus = "ziel.xml" 
03.
Neu = "<str>.</str>" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Set rE = New RegExp 
07.
rE.Global = True 
08.
rE.Pattern = "(<ort>.*</ort>)" 
09.
 
10.
T = fso.OpenTextFile(Ein).ReadAll 
11.
fso.CreateTextFile(Aus).Write rE.Replace(T, "$1" & vbCrLf & Neu)
Grüße
bastla
Bitte warten ..
Mitglied: hoomer
04.05.2011 um 21:41 Uhr
Also das Skript funktioniert wie gesagt.

Leider hat sich beim Testen herausgestellt das beim Weiterverarbeiten der ziel XML ein Problem mit Sonderzeichen besteht.

Nachdem ich nun wieder gesucht und probiert habe bin ich auf eine Anleitung in diesem Forum gestoßen und habe diese für meine Bedürfnisse angepasst.
Genau darin liegt das Problem )-:

Folgendes müsste noch in die Batch eingebaut werden damit die Sache PERFEKT funktioniert.

Es sind Doppelpunkte : und Kommas , enthalten die jeweils durch Punkte . ersetzt werden müssten.

Gemäß der gefundenen Anleitung habe ich folgendes konstuiert: (interessant sind nur die ersten 8 Zeilen - da der Rest funktioniert wenn ich Buchstaben statt Sonderzeichen ersetzen möchte)

01.
@echo off 
02.
set "von=^^:"  
03.
set "zu=^^." 
04.
:zur Kontrolle ob Variablen i.O. sind 
05.
echo %von% 
06.
echo %zu% 
07.
PAUSE 
08.
call :FncReplaseString "%von%" "%zu%" "c:\temp\test.txt" 
09.
goto :EOF 
10.
 
11.
:FncReplaseString  ::Version 1.0.5 
12.
::Parameters:   <FromString> <ToString> <FileName> 
13.
::        or:   <VarNameToReturnReplasedText> <FromString> <ToString> <TextToReplase> 
14.
::Note:         "="-Characters are not allowed in FromString 
15.
::Example:      call :FncReplaseString _Var "foo" "bar" "the foo"     (_Var="the bar") 
16.
::              call :FncReplaseString "foo" "bar" "d:\text.txt"      (replase string in text-File) 
17.
  setlocal DisableDelayedExpansion &::damit bei der Wertzuweisung keine Ausrufezeichen verloren gehen 
18.
  if "%~4" == "" goto :LEB_FncReplaseString_File 
19.
  ::String im uebergebenen Text austauschen und der Variablen (%1) zuweisen 
20.
    set "_FncReplaseString_Text=%~4" 
21.
    setlocal EnableDelayedExpansion  &::ermoeglicht die folgende Syntax 
22.
    set _FncReplaseString_Text=!_FncReplaseString_Text:%~2=%~3! 
23.
      rem Alternativ dazu: call set %~1=%%_FncReplaseString_Text:%~2=%~3%% 
24.
    ::die beiden oben und hier geoeffneten setlocal-Instanzen schließen & Variable uebernehmen: 
25.
    endlocal & set "_FncReplaseString_Text=%_FncReplaseString_Text%" 
26.
    endlocal & set "%~1=%_FncReplaseString_Text%" 
27.
   exit /b 0 
28.
    
29.
  :LEB_FncReplaseString_File 
30.
  set _FncReplaseString_TmpFile=%TMP%\%~n0_out%RANDOM%.tmp 
31.
  if exist "%~3" ( ::String in einer Text-Datei austauschen 
32.
    for /F "tokens=1* delims=:" %%a in ('type %3 ^| findstr /n $') do ( 
33.
    ::type konvertiert UC nach ANSI; findstr verhindert, dass Leerzeilen verloren gehen 
34.
      if not "%%b" == "" ( 
35.
        set _FncReplaseString_TextLine=%%b 
36.
        setlocal EnableDelayedExpansion  &::ermoeglicht die folgende Syntax 
37.
        set _FncReplaseString_TextLine=!_FncReplaseString_TextLine:%~1=%~2! 
38.
        echo.!_FncReplaseString_TextLine! 
39.
        endlocal &rem schließt die hier geoeffnete setlocal-Instanz 
40.
      ) else (echo.) 
41.
    ) >>%_FncReplaseString_TmpFile% 
42.
    move %_FncReplaseString_TmpFile% "%~3" 
43.
44.
  endlocal &rem schließt die oben geoeffnete setlocal-Instanz 
45.
 exit /b 0
PS: Vielen dank an den Verfasser dieser Anleitung - die Kommentare sind durchaus hilfreich.

Danke Hoomer
[Edit] Codeformatierung - sorry @bastla, da bin ich zu ungeduldig zum Warten auf hoomer [/Edit]
Bitte warten ..
Mitglied: bastla
04.05.2011 um 21:50 Uhr
Hallo hoomer!

Soferne VBS doch eine Option sein sollte, müsste nur die Zeile 10 durch
T = Replace(Replace(fso.OpenTextFile(Ein).ReadAll, ":", "."), ",", ".")
ersetzt werden.

Grüße
bastla

P.S.: Egal, ob CMD oder VBS - mit "Code"-Formatierung (lässt sich auch nachträglich noch einfügen ) wird's besser lesbar ...
Bitte warten ..
Mitglied: Friemler
04.05.2011 um 22:16 Uhr
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:

01.
Ein = "quelle.xml" 
02.
Aus = "ziel.xml" 
03.
Neu = "<str>.</str>" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Set rE = New RegExp 
07.
rE.Global = True 
08.
rE.Pattern = "(<ort>.*</ort>)" 
09.
 
10.
T = fso.OpenTextFile(Ein).ReadAll 
11.
T = rE.Replace(T, "$1" & vbCrLf & Neu) 
12.
 
13.
rE.Pattern = ":|," 
14.
T = rE.Replace(T, ".") 
15.
 
16.
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]
Bitte warten ..
Mitglied: bastla
04.05.2011 um 22:31 Uhr
@Friemler
Oh, da war der bastla wieder schneller!
Dafür hast Du aber die wesentlich übersichtlichere Version geliefert ...

Grüße
bastla
Bitte warten ..
Mitglied: hoomer
05.05.2011 um 14:34 Uhr
Das VB-Skript funktioniert "nur" zum ersetzen der Zeichen.
Ich lasse jetzt erst die Batch durchlaufen und rufe am Ende das VBS auf.

Nicht Elegant aber es funktioniert (-:

nochmals vielen dank

Hoomer
Bitte warten ..
Mitglied: bastla
05.05.2011 um 15:08 Uhr
Hallo hoomer!

Woran ist das "Nicht-Funktionieren" des VB-Scripts denn zu erkennen?

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
05.05.2011 um 15:11 Uhr
Hallo Hoomer,

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]
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch zum bearbeiten mehrerer CSV (3)

Frage von Matzus87 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...