pieh-ejdsch
Goto Top

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.
back-to-topStringlänge einer Variable
cmd /u /von /c "echo !path!"|find /v ""|findstr .|find /c /v ""
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.

@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%

back-to-topOffset von Zeichen anzeigen
cmd /u /c "type D:\dieEinzeiligeTabelle.csv"| find /v ""|findstr /n ";"
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
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
)
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

Content-ID: 189190

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

rubberman
rubberman 07.08.2012 aktualisiert um 20:14:55 Uhr
Goto Top
Hallo PH!

Dass find und more das NUL Zeichen als Zeilenumbruch interpretieren, war mir bis jetzt entgangen. Gut zu wissen face-smile
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  
- 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]