Batchdatei: Leerzeichen in File schreiben/Zeilenumbruch verhindern
Hallo @ alle,
ich habe die "tolle" Aufgabe, ein XML-File in ein ASCII-File mit festen Feldlängen zu überführen. Ein wenig bin ich schon vorangekommen, hänge jetzt allerdings an einer Sache:
Da die Felder vorgeschriebene Feldlängen haben, muss der Platz, den der entsprechende Wert nicht einnimmt mit Leerzeichen aufgefüllt werden. Ich dachte, ich könnte das so lösen:
::errorlänge=Länge der Zeichenkette
::laenge=Feldlänge
...
:write
set /a errorlevel+=1
::---hinter dem zweiten %zeichenfolge% ist noch ein Leerzeichen-----
set %zeichenfolge%=%zeichenfolge%
if not %errorlevel%==%laenge% goto :write
echo %zeichenfolge%>>daten.txt
Leider wird aber kein Leerzeichen hinzugefügt... Hat jmd. eine Idee, wie man das erreichen kann?
Anderes Problem: Nach jedem umgeleiteten Echo in eine Datei wird ein Zeilenumbruch eingefügt. Die Daten sollen jedoch hintereinander auf einer Zeile stehen. Gibt es eine Möglichkeit, den Zeilenumbruch zu verhindern?
Vielen Dank und viele vorweihnachtliche Grüße
Daniel
ich habe die "tolle" Aufgabe, ein XML-File in ein ASCII-File mit festen Feldlängen zu überführen. Ein wenig bin ich schon vorangekommen, hänge jetzt allerdings an einer Sache:
Da die Felder vorgeschriebene Feldlängen haben, muss der Platz, den der entsprechende Wert nicht einnimmt mit Leerzeichen aufgefüllt werden. Ich dachte, ich könnte das so lösen:
::errorlänge=Länge der Zeichenkette
::laenge=Feldlänge
...
:write
set /a errorlevel+=1
::---hinter dem zweiten %zeichenfolge% ist noch ein Leerzeichen-----
set %zeichenfolge%=%zeichenfolge%
if not %errorlevel%==%laenge% goto :write
echo %zeichenfolge%>>daten.txt
Leider wird aber kein Leerzeichen hinzugefügt... Hat jmd. eine Idee, wie man das erreichen kann?
Anderes Problem: Nach jedem umgeleiteten Echo in eine Datei wird ein Zeilenumbruch eingefügt. Die Daten sollen jedoch hintereinander auf einer Zeile stehen. Gibt es eine Möglichkeit, den Zeilenumbruch zu verhindern?
Vielen Dank und viele vorweihnachtliche Grüße
Daniel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 46838
Url: https://administrator.de/forum/batchdatei-leerzeichen-in-file-schreiben-zeilenumbruch-verhindern-46838.html
Ausgedruckt am: 18.04.2025 um 09:04 Uhr
11 Kommentare
Neuester Kommentar
Hi Daniel,
bei jedem
echo [irgendwas] >>%ausgabefile%
wird eine einzelne Zeile geschreiben. Ich wüsste lediglich die Variante, dass du die Zeile in einer Variable zusammenbaust und am Ende die Sammelvariable mit echo schreibst, also so etwa:
set ausgabefile=%temp%\testfile.txt
set line=
set line=%line% Hallo
set line=%line% Welt
echo %line% >>%ausgabefile%
Viele Grüsse
-= Axel =-
bei jedem
echo [irgendwas] >>%ausgabefile%
wird eine einzelne Zeile geschreiben. Ich wüsste lediglich die Variante, dass du die Zeile in einer Variable zusammenbaust und am Ende die Sammelvariable mit echo schreibst, also so etwa:
set ausgabefile=%temp%\testfile.txt
set line=
set line=%line% Hallo
set line=%line% Welt
echo %line% >>%ausgabefile%
Viele Grüsse
-= Axel =-
Moin BatzJunior und AxelHahn,
auch wenn ja schon eine Lösung gefunden ist, noch zwei Anmerkungen von mir.
a) das (bewusste) Anfügen von leading oder trailing blanks wie auch das Vermeiden von versehentlichen Leerzeichen habe ich mir wie folgt angewöhnt:
b) Dementprechend würde ich auch das Auffüllen auf eine bestimmte Festlänge anders machen.
Gruß
Biber
auch wenn ja schon eine Lösung gefunden ist, noch zwei Anmerkungen von mir.
a) das (bewusste) Anfügen von leading oder trailing blanks wie auch das Vermeiden von versehentlichen Leerzeichen habe ich mir wie folgt angewöhnt:
>set "text1=bla" & set "text2=blubb " & set "text3= nochwas"
>echo text1[%text1%] text2[%text2%] text3[%text3%]
text1[bla] text2[blubb ] text3[ nochwas]
b) Dementprechend würde ich auch das Auffüllen auf eine bestimmte Festlänge anders machen.
@echo off & setlocal enableDelayedExpansion
Set "40spaces= "
....(XMLDatei durchflöhen, Tags zuordnen...
...
If /i [%TagName%]==[KUNDENNAME] call :writeFeld "%TagValue%" 20
If /i [%TagName%]==[KUNDENR] call :writeFeld "%TagValue%" 12 Left
....
goto :eof
:writeFeld Parameter1 %einwert% Parameter2=SollLänge opt.Parameter3=Links auffüllen
if [%3]== (
REM nicht links auffüllen -- also [%einwert% + SPACES]
Set "thisvalue=~%1%40spaces%"
) Else (
Set "thisvalue=%40spaces%%~1"
REM links auffüllen -- also [SPACES + %einwert%]
)
if [%3]== (
REM nicht links auffüllen -- also n Zeichen von links gezählt
set thisvalue=!thisvalue:~0, %2!
) Else (
REM links auffüllen -- also n Zeichen von rechts gesehen
set thisvalue=!thisvalue:~-%2!
)
REM .... lieber nicht: echo %thisvalue%>>daten.txt
REM ..ich würde es auch "sammeln", wie AxelHahn gepostet hat
Set "GanzerDatensatz=%GanzerDatensatz%%thisvalue%"
goto :eof
Gruß
Biber
Na ja, BatzJunior,
sagen wir so: ein bisschen die Luft aus dem Käse drücken könnten wir schon...
Fangen wir langsam an.
Wenn ich die Länge eines Strings, beispielsweise die Länge meiner Variablen %path% wissen wollte, würde ich am CMD-Prompt eintippseln:
...und 672 wäre auch die Länge von meinem %path%.
Okay, weil ich nicht so oft aufräume natürlich.
Wenn du so etwas als Call-baren Block :GetLen brauchst, hier eine kleine Demo:
Demo der Demo:
Ich habe die bei meinem Prompt angezeigte Uhrzeit mit gepastet/gepostet.
Dauert also nicht soooooooooo lange.
HTH
Biber
P.S. Ich habe auch Strings mit "embedded spaces" berücksichtigt
P.P.S. Ein String der Länge 0 würde die Länge 0 haben statt -1 bei Dir.
P.P.P.S. Meinst Du, wir bekommen noch einen grünen Haken dran vor Silvester?
sagen wir so: ein bisschen die Luft aus dem Käse drücken könnten wir schon...
Fangen wir langsam an.
Wenn ich die Länge eines Strings, beispielsweise die Länge meiner Variablen %path% wissen wollte, würde ich am CMD-Prompt eintippseln:
>(@echo %path%>x) & @for %i in (x) do @set /a "%~zi-2" & del x
672
Okay, weil ich nicht so oft aufräume natürlich.
Wenn du so etwas als Call-baren Block :GetLen brauchst, hier eine kleine Demo:
::----------snipp GetStringlenDemo.bat
@echo off & Setlocal & Set "@=%temp%\strlen.tmp"
::--Begin DEMOSTUFF
Set "EinSatz=seht ihr im folgenden Code des Programmes noch irgendwelche "Verbesserungsmöglichkeiten" hinsichtlich der Performance oder muss ich mich mit einem langsamen Programm abfinden?"
Set "M$="Sympathischer Weltmarktführer""
(Echo 1.Demo Länge vom String [%M$%] ermitteln:) & call :getLen %M$% && echo ---
(Echo 2.Demo Länge vom String [%EinSatz%] ermitteln:)
For /f "tokens=1,*" %%i in ("%Einsatz%") do call:GetAllLen %%i %%j
del %@% & goto :eof
:GetAllLen
call:Getlen %1
If [%2]== goto :eof
shift & Goto GetAllLen
::--End DEMOSTUFF
:getlen
(echo.%1>%@%) & for %%i in (%@%) do @set /a strlen=%%~zi-2
@echo Länge von [%1] ist [%strlen%]
::----------snipp GetStringlenDemo.bat
Demo der Demo:
(=21:16:54 D:\temp=)
>f:\administrator\GetStringLenDemo.bat
1.Demo Länge vom String ["Sympathischer Weltmarktführer"] ermitteln:
Länge von ["Sympathischer Weltmarktführer"] ist [31]
---
2.Demo Länge vom String [seht ihr im folgenden Code des Programmes noch irgendwelche "Verbesserungs
öglichkeiten" hinsichtlich der Performance oder muss ich mich mit einem langsamen Programm abfinden
] ermitteln:
Länge von [seht] ist [4]
Länge von [ihr] ist [3]
Länge von [im] ist [2]
Länge von [folgenden] ist [9]
Länge von [Code] ist [4]
Länge von [des] ist [3]
Länge von [Programmes] ist [10]
Länge von [noch] ist [4]
Länge von [irgendwelche] ist [12]
Länge von ["Verbesserungsmöglichkeiten"] ist [28]
Länge von [hinsichtlich] ist [12]
Länge von [der] ist [3]
Länge von [Performance] ist [11]
Länge von [oder] ist [4]
Länge von [muss] ist [4]
Länge von [ich] ist [3]
Länge von [mich] ist [4]
Länge von [mit] ist [3]
Länge von [einem] ist [5]
Länge von [langsamen] ist [9]
Länge von [Programm] ist [8]
Länge von [abfinden?] ist [9]
(=21:16:55 D:\temp=)
Ich habe die bei meinem Prompt angezeigte Uhrzeit mit gepastet/gepostet.
Dauert also nicht soooooooooo lange.
HTH
Biber
P.S. Ich habe auch Strings mit "embedded spaces" berücksichtigt
P.P.S. Ein String der Länge 0 würde die Länge 0 haben statt -1 bei Dir.
P.P.P.S. Meinst Du, wir bekommen noch einen grünen Haken dran vor Silvester?