split string into substrings based on delimiter
Moderator: DosItHelp
Re: split string into substrings based on delimiter
I have modified my last post that contained code with comments to correct the negative return code and to point out a restriction in using overlapping search strings.
John A.
John A.
Re: split string into substrings based on delimiter
I developed a new method that allows to use this technique to split two variables in the same replacement line, although it uses a trick in order to avoid the REM command that is usually used for this purpose, but that can not work in this case. The trick can also be used to split more than two variables.
Antonio
Code: Select all
@echo off
setlocal EnableDelayedExpansion
set "str=1.0.2.25"
set "vars=Major Minor Revision Subrev"
set "p=%%"
set "v=%vars: =" & set "s=!str:*.=!" & call set "!v!=!p!str:.!s!=!p!" & set "str=!s!" & set "v=%" & set "!v!=!s!"
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
Re: split string into substrings based on delimiter
Hi Aacini,
really nice
It takes a minute to understand your code
Once upon a time, someone told me, that it's nice to explain a bit more and ever after I tried hard.
I suppose for some readers it would be helpful, when you show your idea.
jeb
really nice


It takes a minute to understand your code

Once upon a time, someone told me, that it's nice to explain a bit more and ever after I tried hard.

I suppose for some readers it would be helpful, when you show your idea.
jeb
-
- Posts: 123
- Joined: 17 Jan 2016 23:55
Re: split string into substrings based on delimiter
Aacini,Aacini wrote: ↑19 Feb 2018 15:25I developed a new method that allows to use this technique to split two variables in the same replacement line, although it uses a trick in order to avoid the REM command that is usually used for this purpose, but that can not work in this case. The trick can also be used to split more than two variables.
AntonioCode: Select all
@echo off setlocal EnableDelayedExpansion set "str=1.0.2.25" set "vars=Major Minor Revision Subrev" set "p=%%" set "v=%vars: =" & set "s=!str:*.=!" & call set "!v!=!p!str:.!s!=!p!" & set "str=!s!" & set "v=%" & set "!v!=!s!" echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
I'm really interested in how this works, but I'm struggling to understand it. Can you please explain with some detail this method?
Re: split string into substrings based on delimiter
IcarusLives wrote: I'm really interested in how this works, but I'm struggling to understand it. Can you please explain with some detail this method?
The purpose of the method is to split two strings in their parts. This can be easily done in two lines and then combine the parts in a third line:
Code: Select all
@echo off
setlocal EnableDelayedExpansion
set "str=1.0.2.25"
set "vars=Major Minor Revision Subrev"
set "i=1" & set "s!i!=%str:.=" & set /A i+=1 & set "s!i!=%"
set "i=1" & set "v!i!=%vars: =" & set /A i+=1 & set "v!i!=%"
for /L %%i in (1,1,%i%) do set "!v%%i!=!s%%i!"
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
Code: Select all
set "p=%%"
set "v=%vars: =" & call set "!v!=!p!str:.=& rem !p!" & set "str=!str:*.=!" & set "v=%" & set "!v!=!s!"
^^^^ \________________/
A workaround to do the same process without using a REM command is simple: first, take the rest of values after the first dot: set "s=!str:*.=!"; then, eliminate such a part from the variable (this gives just the first part): call set "!v!=!p!str:.!s!=!p!". Finally, assign the rest of values to the same variable (in preparation for the next part): set "str=!s!".
Code: Select all
set "v=%vars: =" & set "s=!str:*.=!" & call set "!v!=!p!str:.!s!=!p!" & set "str=!s!" & set "v=%" & set "!v!=!s!"
As jeb would say: it's obvious!

Antonio
-
- Posts: 123
- Joined: 17 Jan 2016 23:55
Re: split string into substrings based on delimiter
OOOOHHH Okay now I can see it. Thank you so much for the great explanation!
Re: split string into substrings based on delimiter
I have extended the last method I posted here in order to easily split a string in several parts specified by the length of each one:
Output:
The method is exactly the same than the last explained one, so no further explanations here...
Antonio
Code: Select all
@echo off
setlocal EnableDelayedExpansion
call :Split "10225" "Major:1 Minor:1 Revision:1 Subrev:2"
rem The result should be Major:1, Minor:0, Revision:2, Subrev:25
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
for /F "tokens=2 delims==" %%t in ('wmic os get localdatetime /value') do set "dateTime=%%t"
echo/
echo DateTime: %dateTime%
call :Split "%dateTime%" "Year:4 Month:2 Day:2 Hour:2 Minute:2 Second:2 _:7 Offset:4"
echo Year:%Year% Month:%Month% Day:%Day% Hour:%Hour% Minute:%Minute% Second:%Second% Offset:%Offset%
goto :EOF
:Split string "var1:len1 var2:len2 ..."
set "str=%~1" & set "vars=%~2 " & set "p=%%"
set "v=%vars: =" & set "len=!v:*:=!" & call set "name=!p!v::!len!=!p!" & call set "!name!=!p!str:~0,!len!!p!" & call set "str=!p!str:~!len!!p!" & set "v=%"
exit /B
Code: Select all
Major: 1, Minor: 0, Revision: 2, Subrev: 25
DateTime: 20180819111956.885000-300
Year:2018 Month:08 Day:19 Hour:11 Minute:19 Second:56 Offset:-300

Antonio
Re: split string into substrings based on delimiter
That's neat. Thanks for sharing, Antonio!
Steffen
Steffen