Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.0k views
in Technique[技术] by (71.8m points)

windows - "delims=#+#" - more then 1 character as delimiter

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...