Is it possible to define a delimiter which is not limited to 1 character? Based on the title's example, I would like to define my separator as e.g. '#+#'. Textfiles/lines can contain both characters, but there is very little chance you'll come across that particular substring/text combo.
问题:
回答1:
No, you can not use a string as a delimiter in the delims=
clause. Of course you can include the string, but it will be handled as a set of separate characters that will be used as delimiters, not as a delimiter string.
If you really need to split on a string, the fastest approach could be to replace the delimiter string by a character not included in the data and use this character as delimiter
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "delims=" %%a in ("this is a +test!! #+# of string #splitting#") do (
set "buffer=%%a"
setlocal enabledelayedexpansion
(for /f "tokens=1,2 delims=¬" %%b in ("!buffer:#+#=¬!") do (
endlocal
echo full line : [%%a]
echo first token : [%%b]
echo second token : [%%c]
)) || if "!!"=="" endlocal
)
Note: The setlocal enabledelayedexpansion
is needed to be able to read the variable changed inside the for
loop retrieving the data (here simulated directly including a string). Then, inside the for
loop that tokenizes the readed line, delayed expansion is disabled to avoid problems with the !
characters (if delayed expansion is active, they will be consumed by the parser). This is the reason for the endlocal
inside the loop.
As we are doing a string replacement and it is possible to end with a string composed of only delimiters, it is possible that the do
clause of the inner for
will not be executed, so the final if
is included to ensure that the enabledelayedexpansion
is cancelled.
回答2:
I recently discovered an interesting trick that allows to use a multi-character string as delimiter to split a larger string in a very simple way; the method does not use any for
command, but perform the split in just one line! Here it is:
@echo off
set "str=this is a +test!! #+# of string #splitting#"
set "first=%str:#+#=" & set "last=%"
echo full line : [%str%]
echo first token : [%first%]
echo last token : [%last%]
This method also allows to split a large string in several parts and store all of them in an array. Further details at dos batch iterate through a delimited string