jutzin
Goto Top

String mit Delimitern (Trennzeichen) in Substrings zerlegen?

hi,

ich suche bereits seit geraumer zeit nach einem kochrezept zum zerlegen eines strings der form

abc;defgh;ijklmno1234;...;xyz

in substrings, die dann zur weiteren verarbeitung z.b. in eine datei umgeleitet werden könnten. wie man ein oder mehrere bestimmte tokens ausliest ist mir klar; was aber, wenn ich nicht weiß, wie viele tokens der string enthält und ich alle tokens auslesen will?

beispiel:

REM > substr.txt
FOR /F "delims=;" %%i IN (string.txt) DO ECHO %%i >> substr.txt  

in der datei string.txt steht der string. über den string weiß ich nichts weiter als dass er keine CR/LF enthält und die semikolons als delimiter gelten sollen.

gruß

jutzin


p.s.: es muss batch sein, bitte keine vbscript-lösungen o.ä.! ju

Content-Key: 46794

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

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

Member: miniversum
miniversum Dec 15, 2006 at 08:00:44 (UTC)
Goto Top
Vielleicht gehts nach folgender grober Idee (ungetestet):
Du zerlegst den String. Dabei imemr nur das erste Token udn schreibst es in die Datei substr.txt, den Rest in eine temp.txt
Danach das ganze immer wieder in der temp.txt wiederholen, bis nix mehr in temp.txt geschrieben wird.

set file=substr.txt
set tempfile=temp.txt
FOR /F "tokens=1* delims=;" %%i IN (string.txt) DO ECHO %%i >> %file% && %%j > %tempfile%
:loop
FOR /F "tokens=1* delims=;" %%i IN (%tempfile%) DO ECHO %%i >> %file% && %%j > %tempfile% && if [%%j]= goto :eof
call:loop

:eof

miniversum
Member: Biber
Biber Dec 15, 2006 at 08:05:59 (UTC)
Goto Top
Moin jutzin,

willkommen im Forum.

Bitte mach mal etwas konkreter, was Du vorhast.
Beliebig viele Tokens einfach der Reihe nach auslesen geht
a) eigentlich nicht
b) zum Beispiel so:
:: ---snipp 40Tokens.bat
@echo off & setlocal enableDelayedExpansion

Set testdata=eins;zwei;drei;vier;fünf;sechs;sieben;acht;neun;zehn;elf;zwölf;dreizehn
Set testdata=%testdata%;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;
echo %testdata%>%temp%\40tokens.txt

for /f "delims=; tokens=1,*" %%i in (%temp%\40Tokens.txt) do set "Line=%%j" & call:sub %%i !line:;= ! & goto :eof  

:sub 
@echo %1 
If [%2]== goto :eof
Shift & goto :sub 

Demo am CMD-Prompt:
(= 8:57:45  D:\temp=)
>f:\administrator\40Tokens.bat
eins
zwei
drei
vier
fünf
...
34
35
36
37
38
39
40

(= 9:00:40  D:\temp=)

Gruß
Biber
[Edit]
Tippfehler berichtigt. Alt:!%line:;= ! ------> in neu: !line:;= ! . Siehe Kommentar unten.
Member: jutzin
jutzin Dec 16, 2006 at 16:57:15 (UTC)
Goto Top
hallo zusammen!

erstmal vielen dank an miniversum und biber! eure kommentare hier im forum haben mir schon tierisch oft weitergeholfen.


dann mal zunächst etwas konkreteres zu meinem problem:

  • ich bekomme von einem messgerät einen endlos langen string mit messwerten geliefert, die semikolongetrennt sind. das format der messwerte kann von gerät zu gerät variieren, je nachdem welche geräteversion angeschlossen ist, ob tag oder nacht ist, welche api benutzt wird etc. etc. -- nur dass die werte durch semikolons getrennt sind ist immer der fall.

  • die werte sollen auf einem minirechner an ein plot-programm übergeben werden, dass die werte nur zeilenweise aus einer datei mit einem bestimmten dateinamen auslesen kann.

  • das plot-programm ist älteren datums und darf, da es bereits verteilt ist, nicht mehr geändert werden.

  • die minirechner werden aus wartungs- und kostengründen mit einer art dos betrieben, das mit ein, zwei ausnahmen den funktionsumfang der windows_nt-shell hat.


zu den lösungen:

@miniversum: nach dem prinzip hatte ich mir das auch vorgestellt. leider bewirkt (vermutlich und merkwürdigerweise)
 && if [%%j]= goto :eof
in zeile 5 in deinem code, dass das nächste token ausgeführt wird. das resultiert dann in der ausgabe

Der Befehl "zweites token" ist entweder falsch geschrieben oder konnte nicht gefunden werden
"=" ist syntaktisch an dieser Stelle nicht verarbeitbar.

vielleicht kann ja biber licht ins dunkel bringen.


ich hab es in der zwischenzeit aber so ähnlich hinbekommen:
:loop
for /f "delims=; tokens=1,*" %%i in (string.txt) do echo %%i >> substr.txt & echo %%j > string.txt  
for /f %%i in (string.txt) do if %%i==ECHO goto ende
goto loop

:ende
exit /b [errorlevel]


@Biber: super! (fast genau) so mach ich das. ich lasse aber lieber das %-zeichen in zeile 8 in
!%line:;= !
weg, dan funktioniert das nämlich auch ;o) -- viel besser als mein komischer umweg über die ECHO-ausgabe.


besten dank nochmal an euch beide!


gruß
jutzin
Member: Biber
Biber Dec 18, 2006 at 06:06:58 (UTC)
Goto Top
Moin jutzin,

tja, sorry für den Tippfehler... ich nehme mir zwar immer vor, meine Bätschelchen mal zu testen, bevor ich sie poste...
...aber wie das so ist mit guten Vorsätzen...*axelzuck*

Gut, dass Du verstanden hast, was ich eigentlich gemeint habe face-wink

Den typo hab ich oben berichtigt.

Bei miniversums Variante fehlt, soweit ich das ohne Testen erkennen kann, vor dem %%j die ECHO-Anweisung.
Wenn die Zeile formatiert wird, sieht man/frau es besser:
...
:loop
FOR /F "tokens=1* delims=;" %%i IN (%tempfile%) DO (  
ECHO %%i >> %file% 
:: #####Um das ECHO in der folgenden Zeile geht es##
ECHO %%j > %tempfile% 
if [%%j]= goto :eof
call:loop
)
...

Setzt Du bitte den Beitrag auf "gelöst", wenn es soweit klappt?
Danke
Biber
Member: miniversum
miniversum Dec 18, 2006 at 10:33:21 (UTC)
Goto Top
Tja meine Version war auch nur ne ungetestete Idee.
Aber jeder darf sich denke ich auch mal Tipfehler erlauben solange die Idee verständlich ist ;)

miniversum
Member: jutzin
jutzin Dec 18, 2006 at 11:52:37 (UTC)
Goto Top
'türlich! ich sollte wahrscheinlich nicht so spät nachts die antworten lesen, dann wär mir der typo wohl auch aufgefallen. naja, nochmals besten dank an biber und an dich!

jutzin