Anzahl Zeichen einer Variable zählen
Hallo Zusammen
Ich habe eine Einfach Frage aber leider in den ganzen Beiträgen keine Lösung gefunden.
Ich höchte die Anzahl von Zeichen in eine Variable Zählen.
Ich habe eine Variable die das Datum darstellt ( bekomme ich aus logdateien)
Sie sieht Standardmäßig so aus -> 2009-04-29
Jetzt bekommen Ich aber auch Logdateien in denen das Datum falsch geliefert wird -> -~-2,2-
Also möchte ich jetzt durch Zählen der Zeichen rausfinden ob ich ein gültiges Dateum bekomme.
Befehl 2009-04-29
10
Befehl -~-2,2-
7
Wie ich in eine Beitrag schon gelesen habe mach es eine Unterschied die Anzahl Zeichen einer Zeile zu lese.
Oder die Anzahl Zeiten einer Datei zu Zählen. Das kann ich dank dieses Forums schon.
Ich habe eine Einfach Frage aber leider in den ganzen Beiträgen keine Lösung gefunden.
Ich höchte die Anzahl von Zeichen in eine Variable Zählen.
Ich habe eine Variable die das Datum darstellt ( bekomme ich aus logdateien)
Sie sieht Standardmäßig so aus -> 2009-04-29
Jetzt bekommen Ich aber auch Logdateien in denen das Datum falsch geliefert wird -> -~-2,2-
Also möchte ich jetzt durch Zählen der Zeichen rausfinden ob ich ein gültiges Dateum bekomme.
Befehl 2009-04-29
10
Befehl -~-2,2-
7
Wie ich in eine Beitrag schon gelesen habe mach es eine Unterschied die Anzahl Zeichen einer Zeile zu lese.
Oder die Anzahl Zeiten einer Datei zu Zählen. Das kann ich dank dieses Forums schon.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115075
Url: https://administrator.de/contentid/115075
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo,
ich halte den Ansatz für nicht so sinnvoll, parse auf die Elemente und überprüfe ob ein gültiges Datum dabei rauskommt.
Only braintested
Klar ist das noch auf unmögliche Daten zu prüfen ist 29.2. ohne Schaltjahr etc.
Gruß
LotPings
Edit: Übersichtlicher formatiert
ich halte den Ansatz für nicht so sinnvoll, parse auf die Elemente und überprüfe ob ein gültiges Datum dabei rauskommt.
::Befehl.cmd
@echo off&setlocal
set "Datum=%1"
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do set /A "Jahr=%%A,Monat=%%B,Tag=%%C"
If Defined Jahr if %Jahr% GEQ 1980 if %Jahr% LEQ 2100^
if Defined Monat if %Monat% GEQ 1 if %Monat% LEQ 12^
if Defined Tag if %Tag% GEQ 1 if %Tag% LEQ 31 goto :weiter
echo Ungültiges Datum: %Datum%
goto :eof
:weiter
Only braintested
Klar ist das noch auf unmögliche Daten zu prüfen ist 29.2. ohne Schaltjahr etc.
Gruß
LotPings
Edit: Übersichtlicher formatiert
Moin mycroftone,
willkommen im Forum.
Wie Lotpings schon schrieb - eine Prüfung auf Gültigkeit/Richtigkeit ist sinnvoller als eine Prüfung auf Ungültigkeit.
Und mit einer Prüfung "Ist eine Variable 10 Zeichen lang, dann wird es wohl ein brauchbares Datum sein" überlebst Du im IT-Welt circa 12,7 sec.
Aber wenn es Dir ausreichend erscheint:
-> Wenn eine Variable nur 7 Zeichen lang ist und
-> Du fragst eine Substring-Funktion nach dem Teilstring von Zeichen 8 an in der Länge 3
-> dann wirst Du bei allen mir bekannten SubStr()-varianten dieser Galaxie einen Leerstring zurückbekommen.
Auch von der CMD.exe
Demo am CMD-Prompt:
Wenn Du also vorrangig diese fehlerhaften 7stelligen Datums-Werte abfangen willst--> prüfe es so.
Grüße
Biber
willkommen im Forum.
Wie Lotpings schon schrieb - eine Prüfung auf Gültigkeit/Richtigkeit ist sinnvoller als eine Prüfung auf Ungültigkeit.
Und mit einer Prüfung "Ist eine Variable 10 Zeichen lang, dann wird es wohl ein brauchbares Datum sein" überlebst Du im IT-Welt circa 12,7 sec.
Aber wenn es Dir ausreichend erscheint:
-> Wenn eine Variable nur 7 Zeichen lang ist und
-> Du fragst eine Substring-Funktion nach dem Teilstring von Zeichen 8 an in der Länge 3
-> dann wirst Du bei allen mir bekannten SubStr()-varianten dieser Galaxie einen Leerstring zurückbekommen.
Auch von der CMD.exe
Demo am CMD-Prompt:
>set testdate=-~-2,2-
>if "%testdate:~7,3%"=="" echo leer
leer
>if "%testdate:~6,3%"=="" echo leer
Wenn Du also vorrangig diese fehlerhaften 7stelligen Datums-Werte abfangen willst--> prüfe es so.
Grüße
Biber
... und wenn es unbedingt sein soll...
In der Theorie könntest Du in einer Zählschleife (FOR /L-Anweisung) das Ende des Strings finden
--Auch nicht getestet--
Grüße
Biber
In der Theorie könntest Du in einer Zählschleife (FOR /L-Anweisung) das Ende des Strings finden
@echo off & setlocal EnableDelayedExpansion
:: Pessimistisch: der String könnte ja 100 Zeichen lang sein
set "WorstCaseLen=100"
set "DerTestString=irgendein Text"
For /L %%i in (%WorstCaseLen%,-1,1) do (
if not defined myStrLen if "!DerTestString:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i
)
echo Stringlen [%DerTestString%]: %myStrLen%
--Auch nicht getestet--
Grüße
Biber
::CharCount.cmd
@echo off
set "Zeile=was auch immer du willst"
call :len CharCount "%Zeile%"
echo %CharCount% Zeichn in "%Zeile%"
echo (ohne Anführungszeichen)
goto :eof
:len RetVal(byRef) Value(Byval)
setlocal
set cnt=0
set "chk=%~2"
:len_loop
if not "%chk%"=="" Set /A cnt+=1 & set "chk=%chk:~1%" & goto :len_loop
endlocal&set /A "%1=%cnt%"&goto :eof
HTH
Hallo,
du musst das ja auch korrekt übertragen am Besten Über dem Codeteil auf Quelltext klicken und alles markieren/kopieren.
Die Zeile 7
Die Zeilen 4, 5 und 6 (+7) sind eigentlich eine einzige Zeile, der Übersicht halber habe ich die mit Hilfe des ^ am Emde umgebrochen ohne das sie logisch getrennt sind.
Nur wenn wirklich alle if Bedingungen erfüllt sind geht es Weiter, Durch dein Trennen geht es in jedem Fall weiter und da dem letzten IF der Then Teil fehlt gibt es einen Fehler.
Und wenn du im Editorfenster bist sieh dir bitte den roten Link Formatierungshilfe an.
Dann kann man deinen Text auch besser lesen wenn code eben mit
< code> und
< /code> markiert wird (dann ohne Leerzeichen hinter dem < )
Gruß
LotPings
du musst das ja auch korrekt übertragen am Besten Über dem Codeteil auf Quelltext klicken und alles markieren/kopieren.
Die Zeile 7
goto :weiter
gehört ans Ende deiner Zeile 6 so wie es auch von mir gepostet wurde.Die Zeilen 4, 5 und 6 (+7) sind eigentlich eine einzige Zeile, der Übersicht halber habe ich die mit Hilfe des ^ am Emde umgebrochen ohne das sie logisch getrennt sind.
Nur wenn wirklich alle if Bedingungen erfüllt sind geht es Weiter, Durch dein Trennen geht es in jedem Fall weiter und da dem letzten IF der Then Teil fehlt gibt es einen Fehler.
Und wenn du im Editorfenster bist sieh dir bitte den roten Link Formatierungshilfe an.
Dann kann man deinen Text auch besser lesen wenn code eben mit
< code> und
< /code> markiert wird (dann ohne Leerzeichen hinter dem < )
Gruß
LotPings
Moin mycroftone,
falls Lotpings noch beim Frühstücken ist:
Die Zeile [ set /A "Jahr=%%A,Monat=%%B,Tag=%%C" ] ist natürlich in DIESEM Testschnipsel obsolet und wäre nur sinnvoll in einem Batch, der nach Datumsüberprüfung mit %Jahr%, %Monat%, %Tag% irgendetwas weiterarbeiten soll.
Grüße
Biber
falls Lotpings noch beim Frühstücken ist:
@echo off & setlocal EnableDelayedExpansion
Call :Check_Datum 2009-04-29
Call :Check_Datum -~-2,2-
goto :eof
:: ~~~ hier ist Ende Vom Batch
:Check_Datum
set "Datum=%1"
echo.
echo Teste
echo.
for /F "tokens=1-3 delims=-" %%A in ("%Datum%") Do (
if "%%C" NEQ "" IF "%%B" NEQ "" (
if %%A GEQ 1980 if %%A LEQ 2100 (
if %%B GEQ 1 if %%B LEQ 12 (
if %%C GEQ 1 if %%C LEQ 31 (
set /A "Jahr=%%A,Monat=%%B,Tag=%%C"
goto :weiter
)))))
echo.
echo Ungueltiges Datum: %Datum%
echo.
echo.
pause
goto :EOF
:: ~~~ hier ist Ende von Sub :CheckDatum --GOBACK
:weiter
echo.
echo gueltige Datum: %Datum%
echo.
echo.
pause
:: ~~~ hier ist Ende der BatchDATEI..hier ist Feierabend
Die Zeile [ set /A "Jahr=%%A,Monat=%%B,Tag=%%C" ] ist natürlich in DIESEM Testschnipsel obsolet und wäre nur sinnvoll in einem Batch, der nach Datumsüberprüfung mit %Jahr%, %Monat%, %Tag% irgendetwas weiterarbeiten soll.
Grüße
Biber
Setz mal auf Zeile 21:
Wenn da noch ein alter Wert drin steht, prüft er in der For /L Schleife gar nicht mehr.
( Das ist übrigens ein guter Grund Sub Routinen mit einem setlocal auszustatten, was aber eine Initialisierung wichtiger Variablen auch nicht ersetzt.)
Gruß
LotPings
Edit: Hallo Bastla, bin nicht so früh aufgestanden und anscheinend immer noch im TRAN-modus.
Set "myStrLen="
Wenn da noch ein alter Wert drin steht, prüft er in der For /L Schleife gar nicht mehr.
( Das ist übrigens ein guter Grund Sub Routinen mit einem setlocal auszustatten, was aber eine Initialisierung wichtiger Variablen auch nicht ersetzt.)
Gruß
LotPings
Edit: Hallo Bastla, bin nicht so früh aufgestanden und anscheinend immer noch im TRAN-modus.