2014-10-29 35 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