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

Batchdatei: Leerzeichen in File schreiben/Zeilenumbruch verhindern

Frage Entwicklung Batch & Shell

Mitglied: BatzJunior

BatzJunior (Level 1) - Jetzt verbinden

15.12.2006, aktualisiert 20.12.2006, 13153 Aufrufe, 11 Kommentare

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
Mitglied: AxelHahn
15.12.2006 um 15:14 Uhr
Hi Daniel

Füge das Sonderzeichen ^ und ein Leerzeichen ein. Beim SET nimm bei der zu setzenden Variable die % Zeichen weg:

set zeichenfolge=^ %zeichenfolge%

... dann geht es.

Viele Grüsse
-= Axel =-
Bitte warten ..
Mitglied: BatzJunior
15.12.2006 um 15:29 Uhr
Hi Axel,

vielen Dank, dass hat super geklappt! Weißt Du zufällig auch noch eine Lösung für das Zeilenumbruch-Problem?

Liebe Grüße!

Daniel
Bitte warten ..
Mitglied: AxelHahn
15.12.2006 um 15:43 Uhr
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 =-
Bitte warten ..
Mitglied: Biber
16.12.2006 um 00:11 Uhr
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:
01.
>set "text1=bla" & set "text2=blubb   "  & set "text3=        nochwas" 
02.
>echo text1[%text1%] text2[%text2%] text3[%text3%] 
03.
text1[bla] text2[blubb   ] text3[        nochwas]
b) Dementprechend würde ich auch das Auffüllen auf eine bestimmte Festlänge anders machen.

01.
@echo off & setlocal enableDelayedExpansion 
02.
Set "40spaces=                                        " 
03.
 
04.
....(XMLDatei durchflöhen, Tags zuordnen... 
05.
... 
06.
If /i [%TagName%]==[KUNDENNAME] call :writeFeld "%TagValue%" 20 
07.
If /i [%TagName%]==[KUNDENR]        call :writeFeld "%TagValue%" 12 Left 
08.
.... 
09.
goto :eof 
10.
 
11.
:writeFeld Parameter1 %einwert% Parameter2=SollLänge opt.Parameter3=Links auffüllen 
12.
if [%3]==[] ( 
13.
   REM nicht links auffüllen -- also [%einwert% + SPACES]  
14.
   Set "thisvalue=~%1%40spaces%" 
15.
) Else ( 
16.
   Set "thisvalue=%40spaces%%~1" 
17.
   REM links auffüllen -- also [SPACES + %einwert%]  
18.
19.
if [%3]==[] ( 
20.
   REM nicht links auffüllen -- also  n Zeichen von links gezählt 
21.
   set thisvalue=!thisvalue:~0, %2! 
22.
) Else ( 
23.
     REM links auffüllen -- also  n Zeichen von rechts gesehen 
24.
    set thisvalue=!thisvalue:~-%2! 
25.
26.
REM .... lieber nicht: echo %thisvalue%>>daten.txt   
27.
REM ..ich würde es auch "sammeln", wie AxelHahn gepostet hat 
28.
Set "GanzerDatensatz=%GanzerDatensatz%%thisvalue%" 
29.
goto :eof
Gruß
Biber
Bitte warten ..
Mitglied: BatzJunior
18.12.2006 um 10:08 Uhr
Hey Biber,

vielen Dank für Deine Antwort, die mich schon ein ganzes Stückchen weitergebracht hat! Auch möchte ich mich für Deine Tutorials, aus denen ich so einiges mitnehmen konnte, bedanken!
Ein Problem habe ich jetzt noch: Und zwar beihalten die Tagwerte zum Teil Anführungszeichen. Wie kann ich es anstellen, diese da herauszubekommen bzw. zu maskieren?

set wert2=%wert2:"=^"%

funktioniert da nicht und bei einigen Überprüfungen streikt die Konsole, wenn an einer bestimmten Stelle gerade ein Anführungszeichen vorkommt...

Liebe Grüße; Daniel
Bitte warten ..
Mitglied: miniversum
18.12.2006 um 11:15 Uhr
versuchs so:

set wert2=%~wert2%

oder alternativ:

set wert2=%wert2:~1,-1%

miniversum
Bitte warten ..
Mitglied: BatzJunior
18.12.2006 um 13:47 Uhr
Vielen Dank!
Bitte warten ..
Mitglied: Biber
18.12.2006 um 14:38 Uhr
Moin BatzJunior,

teilen wir uns die Restarbeit?
Du setzt auf "Gelöst", ich verschiebe den Beitrag von "Entwicklung" nach "Batch & Shell" und schließe ihn demnächst?

Ich gehe schon mal in Vorleistungen und verschiebe den Thread...

[Wenn noch Fragen offen sind, dann natürlich weiterfragen...]

Gruß
Biber
Bitte warten ..
Mitglied: BatzJunior
19.12.2006 um 08:40 Uhr
Hi Biber und alle anderen,

eine Frage habe ich tatsächlich noch:
Da die Feldlängen ja fest vorgegeben sind, die Längen der Werte ja aber variieren, muss ich für jeden Wert die Länge ermitteln. Zum Glück habe ich dazu ein nettes Batch-Programm im Netz gefunden, welches seine Aufgabe auch (fast) perfekt bewerkstelligt. Das Problem dabei ist jedoch das es seeeehr langsam arbeitet. Somit brauche ich für einen XML-File mit ca. 60 Werten 3 Minuten...
1. Siehst Du/seht ihr im folgenden Code des Programmes noch irgendwelche Verbesserungsmöglichkeiten hinsichtlich der Performance oder muss ich mich mit einem langsamen Programm abfinden?

::setlocal
set errorlevel=-1
if {%1}=={} echo NO ARG GIVEN&call :Help &goto :endit
if {%1}=={/?} call :Help &goto :endit
:start
if {%1}=={} goto :goodendit
set /a paramnum=0
set /a totpos=0
set instring=%1
set instring=%instring:"=%
call :GET_LENGTH %instring%
:goodendit
set /a spaces=%paramnum%-1
set /a totpos=%totpos%+%spaces%
set errorlevel=%totpos%
:endit
::echo %errorlevel%
::endlocal
goto :eof

:GET_LENGTH
:NEXT_STRING
if {%1}=={} goto :eof
set /a paramnum+=1
set string=%1
set /a pos=0
:NEXT_CHAR
set onechar=%%string^:^~%pos%,1%%
for /f "tokens=1,2 delims==" %%a in ('set onechar') do for /f %%c in ('echo %%b') do call :countit %%c
if defined GOTADDED goto :NEXT_CHAR
set /a totpos=%totpos%+%pos%
shift /1
goto :NEXT_STRING

:Help
echo USAGE:%~n0 string OR %~n0 "see with spaces"
echo function returns the length of the string or -1 (error)
echo a string with embedded spaces should be in quotes ex."count letters"
echo in a batch NTscript "for /f %%%%A in ('length STRING') do set var=%%%%A"
set errorlevel=
goto :eof

:countit
set GOTADDED=
if /i {%1}=={echo} goto :eof
set /a pos+=1
set GOTADDED=yes
goto :eof

Vielen Dank an alle!

Daniel
Bitte warten ..
Mitglied: Biber
19.12.2006 um 21:30 Uhr
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:
01.
>(@echo %path%>x) & @for %i in (x) do @set /a "%~zi-2" & del x 
02.
672
...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:
01.
::----------snipp GetStringlenDemo.bat 
02.
@echo off & Setlocal & Set "@=%temp%\strlen.tmp" 
03.
::--Begin DEMOSTUFF 
04.
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?" 
05.
Set "M$="Sympathischer Weltmarktführer"" 
06.
(Echo 1.Demo Länge vom String [%M$%] ermitteln:) & call :getLen %M$% && echo ---  
07.
(Echo 2.Demo Länge vom String [%EinSatz%] ermitteln:) 
08.
For /f "tokens=1,*" %%i in ("%Einsatz%") do call:GetAllLen %%i %%j 
09.
del %@% & goto :eof 
10.
  
11.
:GetAllLen 
12.
call:Getlen %1 
13.
If [%2]==[] goto :eof 
14.
shift & Goto GetAllLen 
15.
::--End DEMOSTUFF   
16.
:getlen 
17.
(echo.%1>%@%) & for %%i in (%@%) do @set /a strlen=%%~zi-2 
18.
@echo Länge von [%1] ist [%strlen%] 
19.
::----------snipp GetStringlenDemo.bat
Demo der Demo:
01.
(=21:16:54  D:\temp=) 
02.
>f:\administrator\GetStringLenDemo.bat 
03.
1.Demo Länge vom String ["Sympathischer Weltmarktführer"] ermitteln: 
04.
Länge von ["Sympathischer Weltmarktführer"] ist [31] 
05.
--- 
06.
2.Demo Länge vom String [seht ihr im folgenden Code des Programmes noch irgendwelche "Verbesserungs 
07.
öglichkeiten" hinsichtlich der Performance oder muss ich mich mit einem langsamen Programm abfinden 
08.
] ermitteln: 
09.
Länge von [seht] ist [4] 
10.
Länge von [ihr] ist [3] 
11.
Länge von [im] ist [2] 
12.
Länge von [folgenden] ist [9] 
13.
Länge von [Code] ist [4] 
14.
Länge von [des] ist [3] 
15.
Länge von [Programmes] ist [10] 
16.
Länge von [noch] ist [4] 
17.
Länge von [irgendwelche] ist [12] 
18.
Länge von ["Verbesserungsmöglichkeiten"] ist [28] 
19.
Länge von [hinsichtlich] ist [12] 
20.
Länge von [der] ist [3] 
21.
Länge von [Performance] ist [11] 
22.
Länge von [oder] ist [4] 
23.
Länge von [muss] ist [4] 
24.
Länge von [ich] ist [3] 
25.
Länge von [mich] ist [4] 
26.
Länge von [mit] ist [3] 
27.
Länge von [einem] ist [5] 
28.
Länge von [langsamen] ist [9] 
29.
Länge von [Programm] ist [8] 
30.
Länge von [abfinden?] ist [9] 
31.
 
32.
(=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?
Bitte warten ..
Mitglied: Biber
20.12.2006 um 17:10 Uhr
Moin BatzJunior,

danke für das Haken-Setzen.
Ich setze meinerseits diesen Thread jetzt auf "Geschlossen" - wir sehen uns ja ohnehin im nächsten Thread

Gruß
Biber
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Kl. Frage: Log-File schreiben per Batch (3)

Frage von Yauhun zum Thema Batch & Shell ...

Windows Server
gelöst AD-User einer AD-Gruppe auslesen und in ein File schreiben (15)

Frage von Estefania zum Thema Windows Server ...

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 ...