benni82
Goto Top

BATCH: Zeile mit Trennzeichen zerlegen

Hallo zusammen,

ich bräuchte mal Hilfe und hoffe hier kann mir jemand helfen.

Ich habe eine Textdatei (liste.txt) wo in der Form IP Endungen drin stehen, die mit einem Trennzeichen Semikolon getrennt sind.

Inhalt z. B. 10;11;23;25;30 oder 10;11;23;25;30;124;125

Die Datei kann verschiedene Anzahlen an IP Endungen haben.

Diese Endungen muss per Batch rausfiltern um sie weiterzuverarbeiten. Irgendwie fehlt mir hier ein Gedanke.

Ich würde Sie gerne in eine neue Datei untereinander schreiben lassen (z.b. liste_clean.txt) die dann so aussieht

10
11
23
25
30

Ich habe dies irgendwie schon versucht per for Schleife und token & delims. Aber entweder bekomme ich nur einen einen Wert hineingeschrieben oder wieder die ganze Zeile face-sad

for /f "token=* delims=;" in (liste.txt) do....  
hat aber alles nicht funktioniert face-sad

Sicherlich ganz einfach, aber irgendwie bekomme ich es nicht hin, die Zeichenkette zu zerlegen mit definiertem Trennzeichen. Das Trennzeichen könnte ich auch austauschen, wenn Semikolon ein Problem ergibt.

Die Suche hat mir irgendwie nicht geholfen - genauso wie die große Suchmaschine.

Hat jemand eine Idee?

Vielen Dank im Voraus!

Content-Key: 666412

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

Printed on: April 20, 2024 at 06:04 o'clock

Member: TK1987
Solution TK1987 May 04, 2021 updated at 18:55:15 (UTC)
Goto Top
Moin,

wieso nicht gleich mit Powershell?

Zitat von @Benni82:
Ich habe dies irgendwie schon versucht per for Schleife und token & delims. Aber entweder bekomme ich nur einen einen Wert hineingeschrieben oder wieder die ganze Zeile face-sad
for /f "token=* delims=;" in (liste.txt) do....  
hat aber alles nicht funktioniert face-sad
Zum einen fehlt bei deinem Schnipsel die Schleifenvariable, darüber hinaus scheinst du das mit den Tokens nicht richtig verstanden zu haben.

Deine Zeile wird an den Trennzeichen, die du mittels Delims festgelegt hast gesplittet. Mit Tokens legst du fest, welcher gesplittete Teil der Zeichenkette in welche Schleifenvariablen geschrieben wird.
"Tokens=*" bedeutet hier soviel wie "Schreibe alles restliche ungesplittet in die nächste folgende Variable", somit erhälst du natürlich wieder die Ganze Zeile.
for /f "Tokens=1-5 Delims=;" %%A in (liste.txt) do (  
  echo Token 1 = %%A
  echo Token 2 = %%B
  echo Token 3 = %%C
  echo Token 4 = %%D
  echo Token 5 = %%E
)

Gruß Thomas
Member: SeaStorm
SeaStorm May 04, 2021 at 20:13:24 (UTC)
Goto Top
Warum stirbt dieses olle Batch denn nicht endlich face-sad
Nimm doch Powershell. Damit machst du da einen Einzeiler draus und hast am Ende schöne Objekte mit denen man ordentlich hantieren kann ...

gc liste.txt | %{ $_ -split ";" | %{ echo "IP: $_" }}  
Member: Benni82
Benni82 May 04, 2021 updated at 20:48:33 (UTC)
Goto Top
Vielen Dank für Eure Antwort.

Ich kann es aktuell nicht testen, aber wenn ich das in der Theorie so sehe, sind hier ja die tokens 1-5 definiert. Es können aber immer unterschiedliche Anzahlen sein. Oder sehe ich das falsch? Also mal stehen 5 in der Datei und mal auch 10

Ja, mit diesen delims und token tue ich mich leider oft schwer. Die Variable habe ich aber tatsächlich nur hier vergessen, dass hatte ich schon drin. Das war auch nur der Ideen Ansatz, vielleicht gibt es da besseres.

Powershell kann ich hier leider nicht nehmen. Es handelt sich hier um bestehende XP Systeme (Ja, wirklich!) wo nichts installiert werden kann, sorry face-sad
Member: SeaStorm
SeaStorm May 04, 2021 at 21:47:51 (UTC)
Goto Top
@echo off

setlocal enableextensions
set /p inText=<liste.txt
call :iterate inText
pause
goto :eof

:iterate:
setlocal enableextensions enabledelayedexpansion
for /f "tokens=1,* delims=;" %%a in ("!%1!") do set "%1=%%b" & call :dowork %%a  
if "!%1!" neq "" goto :iterate:  
goto :eof


:dowork
echo Working at %1

Wi - der - lich ;)
Member: mayho33
mayho33 May 04, 2021 at 21:59:44 (UTC)
Goto Top
Zitat von @Benni82:
Powershell kann ich hier leider nicht nehmen. Es handelt sich hier um bestehende XP Systeme (Ja, wirklich!) wo nichts installiert werden kann, sorry face-sad

Oha! XP? Dein Ernst? Ich hoffe du gehst damit nicht ans Netz.

Wenn kein Powershell dann verwende wenigsten VBScript. Der Scripting Host ist hier per default aktiviert.

Beispiele gibt's Tonnenweise im Netz. Und zum Testen tut auch die Free-Versuon von VBSEdit. Da sind massig an Codesnipeds dabei.

Call einen VBS von der CMD aus dann so:

Cscript "Pfad zur VBS"  

Grüße!
Member: TK1987
Solution TK1987 May 05, 2021 at 04:17:59 (UTC)
Goto Top
Zitat von @Benni82:
Es können aber immer unterschiedliche Anzahlen sein. Oder sehe ich das falsch? Also mal stehen 5 in der Datei und mal auch 10
Ist ja kein Problem, du musst nur die Tokens entsprechend erhöhen etwa auf 1-10. Wenn dann in einer Zeile nur 5 stehen, sind die restlichen Variablen leer.
Member: Benni82
Benni82 May 05, 2021 at 06:32:24 (UTC)
Goto Top
Danke TK1987 face-smile Grade probiert, dass funktioniert super.

Hab jetzt noch ne IF Abfrage vor der Variable eingebaut, dass auch wirklich nur geschrieben wird, wenn %%A usw. nicht leer sind.

Danke! Das hilft mir weiter

P.S. Nein, die XP Rechner (nur noch VM's) sind nicht am Netz face-wink