Top-Themen

Aktuelle Themen (A bis Z)

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, 11137 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 ..
Ähnliche Inhalte
Batch & Shell
Via Batch Zeichen in Textzeilen einfügen
gelöst Frage von LuceDeCielloBatch & Shell3 Kommentare

Hallo, ich habe die Lösung für mein Problem schon fast gefunden. Leider verstehe ich die Positionsangaben in dem Skript ...

VB for Applications
Textzeile in Datei einfügen wenn bestimmtes Wort nicht vorhanden
gelöst Frage von aletriVB for Applications9 Kommentare

Guten Abend allerseits Dieser Script fügt eine Textzeile in Datei ein aber auch dann wenn Zeile in diesem Fall ...

VB for Applications
VBS Textzeile in fsx.cfg Datei an bestimmte Stelle einfügen
gelöst Frage von aletriVB for Applications6 Kommentare

Guten Abende Leute Mit dem hier aufgeführten Script möchte ich den Text "AutogenDescriptionsFilename=AutogenDescriptions_EFRO.xml" einfügen was soweit auch mit der ...

Batch & Shell
Batch - Variable in bestimmte Textzeile schreiben
Frage von iWolf2015Batch & Shell4 Kommentare

Hallo, ich möchte gerne eine Variable in die n-te Zeile eines .txt Dokumentes schreiben. Ich habe schon verschiedene Ansätze ...

Neue Wissensbeiträge
Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 2 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Sicherheit

Teamviewer Sessions können gekapert werden - Update tw. verfügbar

Information von sabines vor 4 TagenSicherheit6 Kommentare

In bestimmten Konstellationen können Teamviewer Sessions gekapert werden, wahrscheinlich aber ein recht unwahrscheinliches Szenario. Da der Teamviewer gerne für ...

Digitiales Fernsehen

Apple TV: Amazon Prime App ist verfügbar

Information von Frank vor 4 TagenDigitiales Fernsehen4 Kommentare

Die Amazon Prime Video App kann ab sofort auf einem Apple TV ab der 3 Generation installiert werden. Einfach ...

Heiß diskutierte Inhalte
Vmware
Installation Windows 10 VMware
Frage von Ghost108Vmware17 Kommentare

Hallo zusammen, versuche gerade mit Hilfe des vshpere clients eine virtuelle Windows 10 maschine aufzusetzen. 1. virtuelle Maschine erstellt ...

Exchange Server
SBS 2011 E-Mails können gesendet werden, aber nicht von extern empfangen
Frage von andreas1234Exchange Server14 Kommentare

Hallo Community, ich habe das Problem, dass seit knapp zwei Wochen die E-Mails von meinem SBS 2011 einwandfrei gesendet ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Windows Server
Server 2012 über Eingabeaufforderung devmgmt.msc geht nicht
gelöst Frage von achim222Windows Server9 Kommentare

Hallo, ich habe hier einen Server 2012 der im Reparaturmodus startet. Es liegt an einem falschen VirtIO Treiber für ...