2014-10-29 71 views
0

完成一个快速搜索,但不能到达这个底部。我想从字符串中删除任何重复值,并用逗号分隔值。例如删除重复的分隔字符串批次

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

处理这将填充一个新的变量与'un-duped'列表。例如

echo %_finalstr% 

将产生:

1,2,3,5,4

增补并发症_STR可以是任何数量的组件(即,它可以是1个值,这可能是200)。它也可以为空。虽然没有特殊字符的问题 - 它将全部采用数字,逗号,数字,逗号等格式。值也可以按任意顺序排列。

任何想法?

回答

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状态下使用。

引用是针对终端空间抑制,遵循标准惯例。

+0

哦 - 非常好,意外的解决方案。 – dbenham 2014-10-30 00:07:15

+0

完美。非常优雅。感谢Magoo!我只是试图计算Set newstring部分如何在if语句的末尾工作... – stigzler 2014-10-30 07:38:52

+0

此解决方案修改输入元素的原始顺序。另外,'IF DEFINED string'部分不是必需的,因为带有空集的'FOR'不会执行任何操作... – Aacini 2014-10-30 18:22:37

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! 
+0

这并不数值排序的数字,如果宽度而变化:10将8. – dbenham 2014-10-30 00:06:05

+0

之前排序有效 !感谢您的更正@dbenham – SachaDee 2014-10-30 00:09:40

+0

修改它并不难,所以它排序。顺便说一句 - 我已经给你+1 :-) – dbenham 2014-10-30 00:38:25

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%" 
+0

这是原始问题的一个很大的延伸。碰巧,这个命令在我的具体情况中并不重要,但是如果它的确如此,那么这很方便。:) – stigzler 2014-11-02 12:17:45

+0

您应该在问题描述中指出... – Aacini 2014-11-02 18:45:04

+0

正确....感谢您的支持帮助,Aacini。 – stigzler 2014-11-03 08:30:07