2014-10-29 5 views
0

빠른 검색은 완료되었지만이 검색 결과의 맨 아래로 이동할 수는 없습니다. 쉼표로 구분 된 값으로 문자열에서 중복을 제거하고 싶습니다. 예 :중복 된 구분 문자열 배치를 제거합니다

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

이렇게 처리하면 새 변수가 '중복되지 않은'목록으로 채워집니다. 예 :

echo %_finalstr% 

생산할 것이다 : 성분의 수 (즉 그 값이 1이 될 수는 200이 될 수 있음) 일 수 _str

1,2,3,5,4

추가 합병증. null 일 수도 있습니다. 특수 문자에는 문제가 없습니다. 숫자, 쉼표, 숫자, 쉼표 등의 형식을 사용합니다. 값은 임의의 순서로 지정할 수도 있습니다.

아이디어가 있으십니까?

답변

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

+0

완벽합니다. 환상적으로 우아합니다. 감사 Magoo! 그냥 if 문 끝에서 Set newstring 파트가 어떻게 작동하는지 파악하려고합니다 ... – stigzler

+0

이 솔루션은 입력 요소의 원래 순서를 수정합니다. 또한 빈 집합을 가진'FOR'은 아무 것도 실행하지 않기 때문에'IF DEFINED string' 부분은 필요 없습니다 ... – Aacini

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

+0

전에 정렬합니다 효과적으로! 수정 해 주셔서 감사합니다 @dbenham – SachaDee

+0

수정하기가 어렵지 않으므로 정렬 할 수 있습니다. BTW - 나는 이미 당신에게 +1을 주었다 :-) – dbenham

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

+0

당신은 문제 묘사에서 그것을 나타내야한다 ... – Aacini

+0

권리 .... 당신을 위해 도움, Aacini. – stigzler

관련 문제