删除重复的分隔字符串批处理

时间:2014-10-29 22:35:15

标签: batch-file

快速搜索,但无法找到这一点的底部。我想从字符串中删除任何重复项,其中值以逗号分隔。 e.g。

set _str=1,2,3,1,5,4,2

对此进行处理会使用“未被欺骗”的新变量填充新变量。名单。例如

echo %_finalstr%

会产生:

1,2,3,5,4

添加了复杂性_str可以是任意数量的组件(即它可以是1个值,它可以是200个)。它也可以是null。没有特殊字符的问题 - 它将全部采用数字,逗号,数字,逗号等格式。值也可以是任何顺序。

有什么想法吗?

3 个答案:

答案 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%"