Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

String mit Delimitern (Trennzeichen) in Substrings zerlegen?

Frage Entwicklung Batch & Shell

Mitglied: jutzin

jutzin (Level 1) - Jetzt verbinden

15.12.2006, aktualisiert 18.12.2006, 11348 Aufrufe, 6 Kommentare

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:

01.
REM > substr.txt 
02.
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
Mitglied: miniversum
15.12.2006 um 09:00 Uhr
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
Bitte warten ..
Mitglied: Biber
15.12.2006 um 09:05 Uhr
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:
01.
:: ---snipp 40Tokens.bat 
02.
@echo off & setlocal enableDelayedExpansion 
03.
 
04.
Set testdata=eins;zwei;drei;vier;fünf;sechs;sieben;acht;neun;zehn;elf;zwölf;dreizehn 
05.
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; 
06.
echo %testdata%>%temp%\40tokens.txt 
07.
 
08.
for /f "delims=; tokens=1,*" %%i in (%temp%\40Tokens.txt) do set "Line=%%j" & call:sub %%i !line:;= ! & goto :eof 
09.
 
10.
:sub  
11.
@echo %1  
12.
If [%2]==[] goto :eof 
13.
Shift & goto :sub 
Demo am CMD-Prompt:
01.
(= 8:57:45  D:\temp=) 
02.
>f:\administrator\40Tokens.bat 
03.
eins 
04.
zwei 
05.
drei 
06.
vier 
07.
fünf 
08.
... 
09.
34 
10.
35 
11.
36 
12.
37 
13.
38 
14.
39 
15.
40 
16.
 
17.
(= 9:00:40  D:\temp=)
Gruß
Biber
[Edit]
Tippfehler berichtigt. Alt:!%line:;= ! ------> in neu: !line:;= ! . Siehe Kommentar unten.
Bitte warten ..
Mitglied: jutzin
16.12.2006 um 17:57 Uhr
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)
01.
 && 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:
01.
:loop 
02.
for /f "delims=; tokens=1,*" %%i in (string.txt) do echo %%i >> substr.txt & echo %%j > string.txt 
03.
for /f %%i in (string.txt) do if %%i==ECHO goto ende 
04.
goto loop 
05.
 
06.
:ende 
07.
exit /b [errorlevel]

@Biber: super! (fast genau) so mach ich das. ich lasse aber lieber das %-zeichen in zeile 8 in
01.
!%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
Bitte warten ..
Mitglied: Biber
18.12.2006 um 07:06 Uhr
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

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:
01.
... 
02.
:loop 
03.
FOR /F "tokens=1* delims=;" %%i IN (%tempfile%) DO ( 
04.
ECHO %%i >> %file%  
05.
:: #####Um das ECHO in der folgenden Zeile geht es## 
06.
ECHO %%j > %tempfile%  
07.
if [%%j]=[] goto :eof 
08.
call:loop 
09.
10.
...
Setzt Du bitte den Beitrag auf "gelöst", wenn es soweit klappt?
Danke
Biber
Bitte warten ..
Mitglied: miniversum
18.12.2006 um 11:33 Uhr
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
Bitte warten ..
Mitglied: jutzin
18.12.2006 um 12:52 Uhr
'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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst PowerShell String zerlegen in Array, DataTable, Hashtable speichern (7)

Frage von derhoeppi zum Thema Batch & Shell ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

C und C++
String einlesen in Array und wieder ausgeben von hinten (4)

Frage von Protected zum Thema C und C ...

Batch & Shell
gelöst Poweshell Script soll String ersetzen und die leere Zeile löschen (4)

Frage von Mars123 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...