Frage von N0chFr4gen, 27

Per Batch einen Satz in Wörter trennen?

Hey @ all,

Ich würde gerne eine Batch schreiben die einen Satz in Wörter umwandelt die Wörter zählt und anschließend die Wörter in variablen speichert.

z.B.

Hallo ich bin ein User ____________________________________________________________ Trennen <-- hier soll er die Wörter trennen

Hallo

ich

bin

ein

User ____________________________________________________________ Zählen <-- hier soll er die Wörter zählen

Hallo ich bin ein User = 5 ____________________________________________________________ Hier soll er die Wörter den variablen zu weißen (Das bekomme ich aber auch alleine hin)

set Wort1=Hallo

set Wort2=ich

set Wort3=bin

set Wort4=ein

set Wort5=User

Ist das umsetzbar? Wenn ja wie?

Danke im voraus

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von S1r1us13, 7

Das geht mit Hilfe des SHIFT-Befehls:

@echo off
Setlocal EnableDelayedExpansion
set Satz=Das hier ist ein Satz. Oder auch zwei.
call :Function_SeparateWords %Satz%

echo %Satz%
echo ----------------------------------
FOR /L %%A IN (1,1,%Counter%) DO echo !Word%%A!
echo ----------------------------------
echo %Satz% = %Counter%
pause
exit

:Function_SeparateWords [%* = Satz]
if "%~1" == "" exit /b
set /a Counter+=1
set Word%Counter%=%1
shift /1
goto Function_SeparateWords

SETLOCAL erlaubt, Variablen auch mit ! statt mit % aufzurufen, wodurch man eine Variable in einer Variable benutzen kann (!Word%%A!).

Der CALL-Befehl ruft die am Ende des Codes geschriebene Funktion auf mit den Parametern, die in der Variable %Satz% gespeichert sind. Die Parameter sind dann mit %1, %2, %3 usw. aufrufbar. Da das Programm nicht weiß, wie viele Parameter es geben wird, kommt der SHIFT-Befehl dazu:

"SHIFT /1" verschiebt den Inhalt von %2 auf %1, von %3 auf %2 usw., also alles eins nach vorne. So kann das Programm zählen, wie viele Parameter es gibt, nämlich so viele, bis %1 keinen Inhalt mehr hat.

Das überprüft der IF-Befehl, der die Funktion beendet, wenn alle Parameter gespeichert sind.

Der SET/A-Befehl zählt die Wörter.
Der SET-Befehl speichert die Wörter.

Wird die Funktion geschlossen (EXIT /B), springt das Programm zurück zu dem CALL-Befehl und fährt mit den darunter stehenden Befehlen fort.

Der FOR/L-Befehl zählt von 1 hoch bis %Counter% und gibt mit Hilfe von ECHO jedes Wort einzeln aus.

Achtung: Stehen mehrere Wörter in Anführungszeichen, behandelt CMD sie als einen einzigen Parameter. Setzt du z. B. den zweiten Satz "Oder auch zwei." in Anführungszeichen, zählt CMD nur noch 6 statt 8 Wörter.

Antwort
von Tschoo, 15

Hallo!

Theoretisch ist es sicherlich umsetzbar -- praktisch eher nicht (ich denke da an cmd -- Linux ist es ohne Probleme realisierabar).

Also die cmd-Befehle/Funktionen gibt es -- es gibt aber Spagetthi-Code der schon beim entwickeln nach einiger Zeit nicht mehr lesbar ist, und du dich in den GOTOs und :labels verirrst.

Die Syntax der Schleifen tut sein übriges -- probiere es lieber mit einer richtigen Programmiersprache.

Gruß

Kommentar von N0chFr4gen ,

Klar könnte ich es in Java oder C++ versuchen, die ich recht gut drauf habe. Aber ich wollte es in Batch machen da das eine "größere" Herausforderung ist.

Kommentar von Tschoo ,

Wenn du es als (persönliche) Herausforderung siehst, dann mach -- aber selber.

Mein Grenze in cmd  war bestimmte Wörter in Text(CNT)dateien (sehr viele in verschiedenen Verzeichnissen,  aber alle gleich aufgebaut) zu suchen, diese dann zu ändern/ersetzten, mit neuem Namen wieder abzuspeichern. Das Linux-EOL(End of Line) Windows-konform zu machen, war das schwierigste (komischerweise).

Wenn noch mal jemand sowas von mir will, in cmd, sage ich gleich NEIN.

Gruß

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten