leerzeichen am anfang und ende einer batch Variablen entfernen (trim in php)
Hallo Leute,
ich würde gerne aus einer Variable die fürhrenden leerzeichen und die am ende entfernen falls vorhanden.
Die Anzahl der leerstellen ist unbekannt, und die leerstellen zwischen worten müssen bleiben.
%var1 =" das ist eine variabel "
ergebnis ="das ist eine variabel"
hat jemand eine idee?
vbs oder andere skripts will ich nicht umbedingt einsetzen.
Danke schonmal
ich würde gerne aus einer Variable die fürhrenden leerzeichen und die am ende entfernen falls vorhanden.
Die Anzahl der leerstellen ist unbekannt, und die leerstellen zwischen worten müssen bleiben.
%var1 =" das ist eine variabel "
ergebnis ="das ist eine variabel"
hat jemand eine idee?
vbs oder andere skripts will ich nicht umbedingt einsetzen.
Danke schonmal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 77687
Url: https://administrator.de/contentid/77687
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo OFFLINE!
Genau genommen sind die Leerzeichen in Deinem Beispiel keine führenden Leerzeichen, da sich davor ein Anführungszeichen befindet (in Batch werden Strings grundsätzlich nicht in Anführungszeichen eingeschlossen).
Beispiel mit "echten" führenden Leerzeichen:
Sollte der Inhalt der Variablen aber tatsächlich die beschriebenen Anführungszeichen enthalten, dann so:
Grüße
bastla
Genau genommen sind die Leerzeichen in Deinem Beispiel keine führenden Leerzeichen, da sich davor ein Anführungszeichen befindet (in Batch werden Strings grundsätzlich nicht in Anführungszeichen eingeschlossen).
Beispiel mit "echten" führenden Leerzeichen:
@echo off & setlocal
set "var1= das ist eine variable "
echo Vorher: #%var1%#
:loop1
if "%var1:~0,1%"==" " set "var1=%var1:~1%" & goto :loop1
:loop2
if "%var1:~-1%"==" " set "var1=%var1:~0,-1%" & goto :loop2
echo Nachher: #%var1%#
@echo off & setlocal
set var1=" das ist eine variabel "
echo Vorher: %var1%
for /f "delims=" %%i in (%var1%) do set "var1=%%~i"
:loop1
if "%var1:~0,1%"==" " set "var1=%var1:~1%" & goto :loop1
:loop2
if "%var1:~-1%"==" " set "var1=%var1:~0,-1%" & goto :loop2
set var1="%var1%"
echo Nachher: %var1%
Grüße
bastla
Hallo OFFLINE!
Die Zerlegung in Teilstrings lässt sich auf die Laufvariablen von "for"-Schleifen nicht anwenden, daher musst Du den gelesenen Wert zunächst einer anderen Variablen zuweisen.
Je nachdem, ob Du ausschließen kannst, dass die zu verarbeitenden Daten das Zeichen "!" enthalten, gibt es zwei mögliche Vorgangsweisen: die Verwendung eines Unterprogrammes oder die "delayedexpansion", die "verzögerte Variablenauflösung". Für letztere gilt die oben angeführte Einschränkung auf Variablenwerte ohne "!".
Mit Unterprogramm würde es dann so aussehen:
Einige Anmerkungen:
Sollten die aus der CSV-Datei ausgelesenen Werte in Anführungszeichen eingeschlossen sein, werden diese durch die Schreibweise %%~d entfernt. Da der Wert an das Unterprogramm (entspricht einem externen, eigenständigen Batch) weitergegeben werden soll, wird er neuerlich zwischen Anführungszeichen gesetzt (um ev "Binnen"-Leerzeichen zu erhalten und den vollständigen Wert weiterzugeben). Durch diese Vorgangsweise wird sichergestellt, dass, unabhängig von der Darstellung der Ausgangsdaten mit oder ohne Anführungszeichen, die Übergabe mit Anführungszeichen erfolgt.
Im Unterprogramm kommt dieser Parameter als %1 an und wird (durch %~1 von den umgebenden Anführungszeichen "befreit") in die Variable %valtemp% "umgespeichert, da auch mit den Parametervariablen %0 bis %9 die Stringzerlegung nicht durchgeführt werden kann.
Noch kurz zu "goto :eof": Damit wird das Ende eines Programmteiles signalisiert, was für das Hauptprogramm "Ende Batch" bedeutet, während es im Unterprogramm als "Return" interpretiert wird. Soferne nach dem Unterprogramm keine weiteren Batchzeilen folgen, kannst Du es auch weglassen - der Rücksprung erfolgt dennoch.
Sollte übrigens %%d tatsächlich ein Wert ohne enthaltene Leerzeichen sein, würde auch schon
genügen, da bei der Parameterübergabe die Leerzeichen als Trennzeichen gelten und damit weg fallen.
Grüße
bastla
Die Zerlegung in Teilstrings lässt sich auf die Laufvariablen von "for"-Schleifen nicht anwenden, daher musst Du den gelesenen Wert zunächst einer anderen Variablen zuweisen.
Je nachdem, ob Du ausschließen kannst, dass die zu verarbeitenden Daten das Zeichen "!" enthalten, gibt es zwei mögliche Vorgangsweisen: die Verwendung eines Unterprogrammes oder die "delayedexpansion", die "verzögerte Variablenauflösung". Für letztere gilt die oben angeführte Einschränkung auf Variablenwerte ohne "!".
Mit Unterprogramm würde es dann so aussehen:
@echo off & setlocal
FOR /F "eol=# tokens=1-12 delims=;" %%a IN (imptest.csv) DO call :ProcessLine "%%~d"
goto :eof
:ProcessLine
set "valtemp=%~1"
echo #%valtemp%#
:loop1
if "%valtemp:~0,1%"==" " set "valtemp=%valtemp:~1%" & goto :loop1
:loop2
if "%valtemp:~-1%"==" " set "valtemp=%valtemp:~0,-1%" & goto :loop2
echo #%valtemp%#
goto :eof
Sollten die aus der CSV-Datei ausgelesenen Werte in Anführungszeichen eingeschlossen sein, werden diese durch die Schreibweise %%~d entfernt. Da der Wert an das Unterprogramm (entspricht einem externen, eigenständigen Batch) weitergegeben werden soll, wird er neuerlich zwischen Anführungszeichen gesetzt (um ev "Binnen"-Leerzeichen zu erhalten und den vollständigen Wert weiterzugeben). Durch diese Vorgangsweise wird sichergestellt, dass, unabhängig von der Darstellung der Ausgangsdaten mit oder ohne Anführungszeichen, die Übergabe mit Anführungszeichen erfolgt.
Im Unterprogramm kommt dieser Parameter als %1 an und wird (durch %~1 von den umgebenden Anführungszeichen "befreit") in die Variable %valtemp% "umgespeichert, da auch mit den Parametervariablen %0 bis %9 die Stringzerlegung nicht durchgeführt werden kann.
Noch kurz zu "goto :eof": Damit wird das Ende eines Programmteiles signalisiert, was für das Hauptprogramm "Ende Batch" bedeutet, während es im Unterprogramm als "Return" interpretiert wird. Soferne nach dem Unterprogramm keine weiteren Batchzeilen folgen, kannst Du es auch weglassen - der Rücksprung erfolgt dennoch.
Sollte übrigens %%d tatsächlich ein Wert ohne enthaltene Leerzeichen sein, würde auch schon
@echo off & setlocal
FOR /F "eol=# tokens=1-12 delims=;" %%a IN (imptest.csv) DO call :ProcessLine %%~d
goto :eof
:ProcessLine
echo #%1#
goto :eof
Grüße
bastla
Hallo OFFLINE!
Unter der Voraussetzung, dass die Trennzeichen (";") bei leeren Werten nicht unmittelbar aufeinander folgen, sondern dazwischen mindestens 1 Leerzeichen steht, sollte es genügen, nach ":loop1" folgende Zeile einzufügen:
und nach der (bisher) letzten Zeile die Fehlerbehandlung für diesen Fall durchzuführen - Beispiel:
Sollten allerdings zwei ";" unmittelbar aufeinander folgen, werden diese als nur ein Trennzeichen interpretiert und es wird dann der Wert des nächsten nicht leeren Feldes verwendet - sag Bescheid, falls das bei Dir zutreffen sollte.
Grüße
bastla
Unter der Voraussetzung, dass die Trennzeichen (";") bei leeren Werten nicht unmittelbar aufeinander folgen, sondern dazwischen mindestens 1 Leerzeichen steht, sollte es genügen, nach ":loop1" folgende Zeile einzufügen:
if not defined valtemp goto :NoValue
:NoValue
echo Es wurde kein Wert gefunden!
goto :eof
Grüße
bastla
Hallo OFFLINE!
Besteht das Problem nach Berücksichtigung von csv-Datei per Batch in einzelne variablen zerlegen immer noch?
Falls ja, bitte Deinen Code posten ...
Grüße
bastla
Besteht das Problem nach Berücksichtigung von csv-Datei per Batch in einzelne variablen zerlegen immer noch?
Falls ja, bitte Deinen Code posten ...
Grüße
bastla
Hallo OFFLINE!
In diesem Fall muss ich auf csv-Datei per Batch in einzelne variablen zerlegen und den von miniversum verwendeten "shift"-Befehl verweisen, da tatsächlich bei %9 (oder %~9) Schluss ist.
Brauchst Du denn alle 12 Felder? Falls doch nicht, könntest Du ja die Buchstaben der nicht benötigten Felder nach "call :ProcessLine" weglassen ...
Grüße
bastla
In diesem Fall muss ich auf csv-Datei per Batch in einzelne variablen zerlegen und den von miniversum verwendeten "shift"-Befehl verweisen, da tatsächlich bei %9 (oder %~9) Schluss ist.
Brauchst Du denn alle 12 Felder? Falls doch nicht, könntest Du ja die Buchstaben der nicht benötigten Felder nach "call :ProcessLine" weglassen ...
Grüße
bastla
Hallo OFFLINE!
Als Zwischenschritt:
Grüße
bastla
P.S.: Und Du bist ganz sicher, dass es Batch sein soll, und nicht vielleicht VBS?
Als Zwischenschritt:
@echo off
setlocal
FOR /F "eol=# delims=" %%z IN (imptest.csv) DO set "Zeile=%%~z" & call :ProcessLine
goto :eof
:ProcessLine
set "Zeile=%Zeile:"=%"
set "Zeile=%Zeile:<=%"
set "Zeile=%Zeile:>=%"
for /f "tokens=1-12 delims=;" %%a in ("%Zeile%") do (
set "var1=%%~a"
set "var2=%%~b"
set "var3=%%~c"
set "var4=%%~d"
set "var5=%%~e"
set "var6=%%~f"
set "var7=%%~g"
set "var8=%%~h"
set "var9=%%~i"
set "var10=%%~j"
set "var11=%%~k"
set "var12=%%~l"
)
echo %var1% %var2% %var3% %var4% %var5% %var6% %var7% %var8% %var9% %var10% %var11% %var12%
Grüße
bastla
P.S.: Und Du bist ganz sicher, dass es Batch sein soll, und nicht vielleicht VBS?
... und so schon näher am Ergebnis:
Grüße
bastla
@echo off
setlocal
FOR /F "eol=# delims=" %%z IN (imptest.csv) DO set "Zeile=%%~z" & call :ProcessLine
goto :eof
:ProcessLine
::Sonderzeichen entfernen
set "Zeile=%Zeile:"=%"
set "Zeile=%Zeile:<=%"
set "Zeile=%Zeile:>=%"
::Leerzeichen entfernen
:loop
set "ZeileAlt=%Zeile%"
set "Zeile=%Zeile: ;=;%"
set "Zeile=%Zeile:; =;%"
if "%Zeile:~0,1%"==" " set "Zeile=%Zeile:~1%"
if "%Zeile:~-1%"==" " set "Zeile=%Zeile:~0,-1%"
if "%Zeile%" neq "%ZeileAlt%" goto :loop
::Leere Felder durch "_" kennzeichnen (wegen Reihenfolge bei der Zerlegung)
:loop2
set "ZeileAlt=%Zeile%"
set "Zeile=%Zeile:;;=;_;%"
if "%Zeile%" neq "%ZeileAlt%" goto :loop2
for /f "tokens=1-12 delims=;" %%a in ("%Zeile%") do (
set "var1=%%~a"
set "var2=%%~b"
set "var3=%%~c"
set "var4=%%~d"
set "var5=%%~e"
set "var6=%%~f"
set "var7=%%~g"
set "var8=%%~h"
set "var9=%%~i"
set "var10=%%~j"
set "var11=%%~k"
set "var12=%%~l"
)
echo #%var1%# #%var2%# #%var3%# #%var4%# #%var5%# #%var6%# #%var7%# #%var8%# #%var9%# #%var10%# #%var11%# #%var12%#
Grüße
bastla
Hallo OFFLINE!
Grüße
bastla
dir scheint das ja richtig spass zu machen den leuten hier mit ihren problemen zu helfen
Wie kommst Du denn auf die Idee? ich werde mal geschwind alles zusammenbauen und dann hier posten.
Gute Strategie, falls damit gemeint ist, dass Du die weiteren Verarbeitungsschritte (bzw das eigentliche Ziel der Aktion) beschreiben willst ...Grüße
bastla
Hallo OFFLINE!
Ansonsten fiele mir folgender Workaround ein: Da jedes Feld (außer dem letzten) ein anschließendes "," benötigt, könntest Du dieses einfach dem Feldinhalt hinzufügen. Wenn ein Feld leer ist ("if not defined"), erhält es eben als einzigen Inhalt ein Komma. Natürlich müssten dann auch die erforderlichen Anführungszeichen bereits Feldinhalt werden [Edit] Unnötiger Schnellschuss ... [/Edit]
Besser (einfacher): Wo benötigt (bzw für alle nicht leeren Felder), die Anführungszeichen in das Feld aufnehmen. [Edit] Siehe unten [/Edit]
Grüße
bastla
[Edit] Idee für Workaround genauer formuliert. [/Edit]
wie kann ich jetzt die letzte echo zeile verändern, dass wenn eine var keinen wert hat die "" nicht in die datei kommen?
Bist Du sicher, dass die Anführungszeichen beim Import benötigt werden (denn für die "echo"-Zeile sind sie eigentlich nicht erforderlich)?Besser (einfacher): Wo benötigt (bzw für alle nicht leeren Felder), die Anführungszeichen in das Feld aufnehmen. [Edit] Siehe unten [/Edit]
Grüße
bastla
[Edit] Idee für Workaround genauer formuliert. [/Edit]