Batch Stringlänge bestimmen (zB. Zeilenlänge, Offset von Zeichen, Spaltenanzahl)
Zum bestimmen von Zeichenlängen gibt es schon meherere Varianten.
Wie die Einzelnen Zeichen von der Variable abgeschnitten werden oder der Offset über findstr bestimmt wird (mit temporären Scripten) oder gar eine Temporäre Datei in der Größe bemessen wird.
Hier wird eine Weitere Variante erläutert.
Hallo Admins,
Der CMD gibt in der Hilfe eine WahlOption /Ansi oder /Unicode für Umleitungen von Ausgaben parat.
Da bei Unicode doppelt so viele Zeichen (immer mit Leerschritt) ausgegeben werden und Find sowie more dies als einzelne Zeilenangaben betrachten, werden somit die Zeichen Zeilenweise ausgegeben.
Die CMD mit aktivierter Verzögerung (enable delayedexpansion) kann aber durch eine Befehlverkettung oder Umleitung nicht richtig Verzögert auflösen. Bei deaktivierter Verzögerung klappt dies.
Find gibt die Unicodeausgabe Zeichen für Zeichen je Zeile aus.
Beim Pipen aus der CMD-Instanz muss nachher mit Findsrt . der Klartext gefiltert werden sonst stehen zwei oder drei Zeichen/Zeilen zuviel da.
Dandach wird die Stringlänge mit Find bestimmt.
Findstr bekommt dazu den Filter für den Delimiter.
In einer CSV ist zB. nicht jede Spalte mit einen Wert belegt aber es wird nur die vierte Spalte und die siebte Spalte als Wert gebraucht.
Dazu wird der Offset der Delimiter ausgelesen. (Offset ist in dem Sinne nicht der richtige Begriff, weil die Zählung schon mit 1 beginnt.) Die exakte Position in einer Variable ist
Der erste Finstr (2. token) markiert den offset, der zweite Findstr (1. token) markiert die Fundnummer.
Mit off5 wird erst die Länge vom offset ausgerechnet inklusive dem Delimiter.
Bei off8 wird der Delimter aus der Stringlänge herausgerechnet.
Wenn kein achter delimiter da wäre, kann vor dieser Rechnung auf Existenz des Off8 geprüft werden.
Gruß Phil
Wie die Einzelnen Zeichen von der Variable abgeschnitten werden oder der Offset über findstr bestimmt wird (mit temporären Scripten) oder gar eine Temporäre Datei in der Größe bemessen wird.
Hier wird eine Weitere Variante erläutert.
Hallo Admins,
Der CMD gibt in der Hilfe eine WahlOption /Ansi oder /Unicode für Umleitungen von Ausgaben parat.
Da bei Unicode doppelt so viele Zeichen (immer mit Leerschritt) ausgegeben werden und Find sowie more dies als einzelne Zeilenangaben betrachten, werden somit die Zeichen Zeilenweise ausgegeben.
Die CMD mit aktivierter Verzögerung (enable delayedexpansion) kann aber durch eine Befehlverkettung oder Umleitung nicht richtig Verzögert auflösen. Bei deaktivierter Verzögerung klappt dies.
Stringlänge einer Variable
cmd /u /von /c "echo !path!"|find /v ""|findstr .|find /c /v ""
Beim Pipen aus der CMD-Instanz muss nachher mit Findsrt . der Klartext gefiltert werden sonst stehen zwei oder drei Zeichen/Zeilen zuviel da.
Dandach wird die Stringlänge mit Find bestimmt.
@echo off
for /f delims^= %%i in (' cmd /u /von /c "echo !path!"^|find /v ""^|findstr .^|find /c /v ""
') do set /a Stringlength = %%i
echo Stringlänge ist %Stringlength%
Offset von Zeichen anzeigen
cmd /u /c "type D:\dieEinzeiligeTabelle.csv"| find /v ""|findstr /n ";"
In einer CSV ist zB. nicht jede Spalte mit einen Wert belegt aber es wird nur die vierte Spalte und die siebte Spalte als Wert gebraucht.
Dazu wird der Offset der Delimiter ausgelesen. (Offset ist in dem Sinne nicht der richtige Begriff, weil die Zählung schon mit 1 beginnt.) Die exakte Position in einer Variable ist
echo %Variable:~(WertFundstelle-1) ,1%
@echo off
setlocal
for /f usebackqdelims^= %%i in ("D:\DieTabelle.scv") do (set "Line=%%i"
for /f "tokens=1,2delims=:" %%i in (' cmd /u /von /c "echo(!Line!"^|find /v ""^|findstr /n ";" ^|findsrt /n . ') do set /a OFF%%i = %%j
set /a Off5 - = off4
set /a Off8 - = off7 -1
setlocal enabledelayedexpansion
for /f "tokens=1-2" %%%i in ("!off4!,!off5! !off7!,!off7a!") do echo !Line:~%%i!!Line:~%%j!
endlocal
)
Mit off5 wird erst die Länge vom offset ausgerechnet inklusive dem Delimiter.
Bei off8 wird der Delimter aus der Stringlänge herausgerechnet.
Wenn kein achter delimiter da wäre, kann vor dieser Rechnung auf Existenz des Off8 geprüft werden.
Gruß Phil
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 189190
Url: https://administrator.de/contentid/189190
Ausgedruckt am: 25.11.2024 um 09:11 Uhr
1 Kommentar
Hallo PH!
Dass
Du könntest evtl. noch 2 Pipes sparen. Ob das an der Perfomance etwas ändert, weiß ich allerdings nicht. Müsste man mal testen.
- snip -
- snip -
Diese merkwürdige Leerzeilen-Caret-Kombination setzt für EOL ein LineFeed-Zeichen und ersetzt somit das Semikolon als Standard-EOL. Somit werden per FOR /F Leerzeilen ignoriert, wobei Zeilen beginnend mit Semikolon trotzdem verarbeitet werden ...
Grüße
rubberman
[EDIT]Ups, da waren 2 Zeilen zu viel.[/EDIT]
Dass
find
und more
das NUL Zeichen als Zeilenumbruch interpretieren, war mir bis jetzt entgangen. Gut zu wissen Du könntest evtl. noch 2 Pipes sparen. Ob das an der Perfomance etwas ändert, weiß ich allerdings nicht. Müsste man mal testen.
- snip -
for /f eol^=^
^ delims^= %%i in (' cmd /u /von /c "echo !path!"^|find /v "" ') do set /a Stringlength += 1
Diese merkwürdige Leerzeilen-Caret-Kombination setzt für EOL ein LineFeed-Zeichen und ersetzt somit das Semikolon als Standard-EOL. Somit werden per FOR /F Leerzeilen ignoriert, wobei Zeilen beginnend mit Semikolon trotzdem verarbeitet werden ...
Grüße
rubberman
[EDIT]Ups, da waren 2 Zeilen zu viel.[/EDIT]