leb0rtran
Goto Top

Batch - Prüfen ob erstes Zeichen einer Variable eine Zahl ist

Hi,

ich will per Batch Prüfen ob das erste Zeichen einer Variable eine Zahl ist.

also einfach

if erstes zeichen von %bla% ist eine zahl (
echo zahl
) else (
echo keine zahl
)

weiß jemand wie das geht?

Schonma Vielen Dank für hilfen.

MFG

Content-Key: 102899

Url: https://administrator.de/contentid/102899

Printed on: April 25, 2024 at 23:04 o'clock

Mitglied: 60730
60730 Nov 28, 2008 at 14:15:19 (UTC)
Goto Top
Servus,

so ganz banal würde ich das so (unelegant und ungetestet) lösen wollen.

set "tmp1=%bla:~-,1%"  
set /a "tmp2=%bla:~-,1%"  
if &tmp1%==%tmp2% Echo erstes zeichen von %bla% ist eine zahl

Was natürlich nur dann funktionieren sollte, wenn %bla% nicht Null ist...

Gruß
Member: Biber
Biber Nov 28, 2008 at 14:53:26 (UTC)
Goto Top
Moin leb0rtran,

das würde ich im Batch genau wie auch in strukturierteren Skriptsprachen mit einen ganz banalen Textvergleich machen.

Wenn erstes Zeichen größer gleich "0" und kleiner gleich "9", dann ist es eine Ziffer.
IF "%var:~0,1%" GEQ "0" IF "%var:~0,1%" LEQ "9" @Echo Var ist eine Ziffer  

Grüße
Biber
Member: leb0rtran
leb0rtran Nov 28, 2008 at 15:13:59 (UTC)
Goto Top
ok,

ne weitere Frage hätte ich noch:

Mit dem Script lese ich Dateien ein, in denen IPs gespeichert sind (zeilenweiße)
Das Zeilenweiße auslesen mach ich atm so

FOR /F "delims=" %%i IN (%file%) DO call :Zeile "%%i"  
...
:eof

:Zeile
SET /A i=i+1
if "%~1" == "%ip%" set ipzeile=%i%  
:eof

alos, hier wird einfach nur gezählt wieviele zeilen die Datie hat (durch die if abfrage sollen dann nurnoch Zeilen gezählt werden, die eine IP enthalten)
danach wird geprüft ob die IP einer schon angegebenen IP entspricht und dann die Zeile gespeichert.

Das Problem ist, wenn die Datei viele Zeilen hat (habs mit 60.000 getestet), braucht das script schon recht lange, so ca ~30s geschätzt.
Kann man das performanter gestalten?
und welche der beiden obrigen Lösungen ist denn performanter?

edit:
Oder geht das per Batch nich schneller?

edit2:
bei der lösung von Biber is mir grad aufgefallen, dass wenn eine Zeile aus ---------- besteht, die auch angezeigt wird
Member: Biber
Biber Nov 28, 2008 at 15:38:33 (UTC)
Goto Top
Moin leb0rtran,

gut, dass Du noch mal nachfragst.
Ich habe es diese Woche schon mal in einem anderen Beitrag geschrieben:
die richtige, aber rein "handwerkliche" Beantwortung ("Welche Syntax muss ich nehmen für...?") einer Frage ist meistens zu kurz gegriffen für eine Lösung. Meist ist ja der Kontext entscheidend für die Wahl einer Lösungsstrategie.

Bei Deinem Problem ginge es VIEL schneller, wenn Du ein Tool verwenden würdest, das Dir ratzfatz die Zeilen zählen kann und eines, das Dir nur die Zeilen, die mit einer Ziffer beginnen, rausflöhen kann.
Dann hast Du ja möglicherweise nur noch 10000 der 60000 Zeilen zu "prüfen".

Beides kann FindStr.exe. (ist auf Deinem Rechner).

Nur Alle Zeilen aus Deiner Ipkrams.txt, die mit einer Ziffer 0-9 beginnen(hier mit Zeilennummer):
findstr /n /R "^[0-9].*" ipkrams.txt
Und einfach alle Zeilen zählen ginge so bsp. am CMD-Prompt):
for /f "delims=:" %i in ('findstr /n $ ipkrams.txt') do @set "linesCount=%i"  
--> linesCount=60016

Grüße
Biber
Mitglied: 60730
60730 Nov 28, 2008 at 15:55:32 (UTC)
Goto Top
Servus again,
edit2:
bei der lösung von Biber is mir grad aufgefallen,
 findstr /n /R "^[0-9].*" ipkrams.txt   
dass wenn eine Zeile aus ---------- besteht, die auch angezeigt wird

Dann halt "so" herum

findstr /n "0 1 2 3 4 5 6 7 8 9" ipkrams.txt

Gruß
Member: leb0rtran
leb0rtran Nov 28, 2008 at 16:08:34 (UTC)
Goto Top
for /f "delims=:" %%i in ('findstr /n /R "^[0-9].*" %file%') do @set "count=%%i"   

Hab ich ma getestet, aber damit werden alle Zeilen gezählt bis zur letzten IP (Zeile die eine Zahl am Anfang hat). Also bei zB

blub
123.123.123.132
bla ---
3.3.3.3:20
bla

kommt 4 raus, richtig wäre aber 2


Und was mir unerklärlich ist, warum wird die letzten Zeile mit nem Doppelpunk an die Zahl hintenangehängt, wenn ich "delsim=" statt "delsim=:" schreib?
Member: Biber
Biber Nov 28, 2008 at 16:15:23 (UTC)
Goto Top
Hmm,

hab ich nicht verstanden, das mit der "--------" Zeile.
Die Ausgabe von "net user" enthält definitiv und reproduzierbar eine solche "---" Zeile.
Wenn ich diese Ausgabe mit meinem Findstr-Ausdruck abgrasen lasse, findet er nix.
 net user>test777.txt
findstr /n  /R "^[0-9].*" test777.txt  
-## oder gleichwertig folgende Syntax ##-
findstr /n /b /R "[0-9].*" test777.txt  
{findet nix; keine Ausgabe}
echo 1233>>test777.txt
findstr /n /b /R "[0-9].*" test777.txt  
9:1233     ---------> works as designed...

Verwundert
Biber
Member: leb0rtran
leb0rtran Nov 28, 2008 at 16:44:51 (UTC)
Goto Top
Schonam Danke für eure mühe,

nachdem ich nu die Lösung von Biber n bissle näher angeschaut hab, udn die auch verstanden hab, bringt die mir 0 geschwindigkeitsvorteil, liegt zum teil auch daran, dass eig fast alle Zeilen IPs sin, andere Zeilen sind die Aussnahme.

Neue Idee die ich hatte, die auch etwas besser ging:
einfach die Letzte Zeilennummer angeben (is zwar ungenauer aber bei mehr als 10k Zeilen is das Wayne ...
und dann einfach die Zeilennummer mit der IP ausgeben.
Nur wie speichere ich das Ergebniss von findstr?

:: RegEx pattern für eine IP
set patternIP=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

:: IP auslesen - liest die IP aus einer Datei aus
set IP=findstr /R "%pattern%" ip.txt  

:: Datei auslesen
set zeile=findstr /n /R "^[0-9].*" %file%  
set zeileip=findstr /n /L "%IP%%" %file%  
Member: Biber
Biber Nov 28, 2008 at 17:03:03 (UTC)
Goto Top
Ach soooooooo, leb0rtran,

jetzt [edit] bezogen auf den Post direkt über diesem [/edit] versteh ich, warum wir zu unterschiedlichen Ergebissen kommen.

Oben sprach ich von ZWEI Aktionen
  • erstens ALLE Zeilen zählen (anzahl zeilen der Textdatei). Dafür brauchst Du den "FindStr /n $" -Befehl
  • zweitens einen FindStr-befehl, der Dir wirklich die Zeilen filtert, d.h. der Dir nur die mit einer Ziffer beginnenden zeilen liefert.

Nochmal zur Verdeutlichung: wenn Du die Anzahl zeilen wissen willst, die mit einer Ziffer anfangen:
>type ipkrams.txt
blub
123.123.123.132
bla ---
3.3.3.3:20
bla

>findstr /n /b /R "[0-9].*" ipkrams.txt  
2:123.123.123.132
4:3.3.3.3:20

>for /f "delims=:" %i in ('findstr /n /b /R "[0-9].*" ipkrams.txt') do set /a cnt+=1  
2 <---------------Ergebnis: 2 Zeilen as should do
Wenn Du die eigentlichen Zeilen noch betrachten,/verarbeiten willst, also z.B. wie in Deinem allerersten Ansatz an eine Call:Routine weitergeben willst:
>for /f "tokens=1* delims=:" %i in ('findstr /n /b /R "[0-9].*" ipkrams.txt') do @echo [%j]  
[123.123.123.132]
[3.3.3.3:20]

Grüße
Biber
Member: leb0rtran
leb0rtran Nov 29, 2008 at 13:53:31 (UTC)
Goto Top
weiß den keiner wie das geht?