快速搜索,但无法找到这一点的底部。我想从字符串中删除任何重复项,其中值以逗号分隔。 e.g。
set _str=1,2,3,1,5,4,2
对此进行处理会使用“未被欺骗”的新变量填充新变量。名单。例如
echo %_finalstr%
会产生:
1,2,3,5,4
添加了复杂性_str可以是任意数量的组件(即它可以是1个值,它可以是200个)。它也可以是null。没有特殊字符的问题 - 它将全部采用数字,逗号,数字,逗号等格式。值也可以是任何顺序。
有什么想法吗?
答案 0 :(得分:2)
一种方式:
@echo off
set "$str=1,2,3,1,5,4,2"
for %%a in (%$str%) do set "##%%a=%%a"
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%a in ('set ##') do set "$FinalStr=!$FinalStr!,%%a"
set "$FinalStr=!$FinalStr:~1!"
echo !$FinalStr!
答案 1 :(得分:2)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "string=1,2,3,5,4,2"
CALL :process
SET "string=1,2,3,5,4,2,1,1,1,1,1,1,1,1,107,221,3,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,13,2,1"
CALL :process
SET "string="
CALL :process
SET "string=3"
CALL :process
SET "string=3,3"
CALL :process
GOTO :eof
:process
SET "newstring=,"
IF DEFINED string FOR %%a IN (%string%) DO (SET "newstring=!newstring:,%%a,=,!%%a,")
SET "newstring=%newstring:~1,-1%"
ECHO oldstring:%string%:
ECHO newstring:%newstring%:
GOTO :EOF
另一种方式,内置演示
编辑---解释。
将newstring
设置为单个逗号。这样可以确保newstring
以逗号开头和结尾。
for
遍历字符串中的每个元素;逗号被视为分隔符。
对于找到的每个元素n
,将所有,n,
替换为,
,然后将n,
添加到最后。
结果:由,
包围的唯一元素列表 - 所以删除第一个和最后一个字符并完成。
请注意,delayedexpansion
和!
的使用有助于此方法,但
IF DEFINED string FOR %%a IN (%string%) DO CALL SET "newstring=%%newstring:,%%a,=,%%%%a,"
无论delayedexpansion
状态如何,都可以使用。
按照标准惯例,报价用于终端空间抑制。
答案 2 :(得分:0)
下面的批处理文件按照OP的要求保留元素的原始顺序:
set _str=1,2,3,1,5,4,2
处理此操作会使用“未加工”列表填充新变量。例如
echo %_finalstr%
会产生:
1,2,3,5,4
@echo off
setlocal EnableDelayedExpansion
set _str=1,2,3,1,5,4,2
REM set "_str="
set "_finalstr=,"
for %%a in (%_str%) do if "!_finalstr:,%%a,=!" equ "!_finalstr!" set "_finalstr=!_finalstr!%%a,"
set "_finalstr=%_finalstr:~1,-1%"
echo Oldstring: "%_str%"
echo Newstring: "%_finalstr%"