Это можно сделать с помощью простого цикла for
.Взяв мой предоставленный код непосредственно из примера из этого поста от Стефан - Мы берем каждое слово из вашего String
, а затем просто проверяем, не было ли оно уже использовано в пуле слов.
RemoveAllDuplicateWords.bat :
@ECHO OFF
@setlocal EnableDelayedExpansion
Set "String=table desk chair chair book chair candle lamp lamp desk"
set "newstring="
for %%i in (%string%) do (
echo !newstring!|findstr /i "\<%%i\>" >nul || set "newstring=!newstring! %%i"
)
Set "furniture=%newstring:~1%"
Echo %furniture%
Как указано Стефаном, удалите /i
, если вы хотите, чтобы фильтр чувствителен к регистру.
РЕДАКТИРОВАТЬ:
Таким образом, из-за недоразумения по запросу потока, я привел РЕДАКТИРОВАТЬ, которая решит сообщение пользователя (Надеюсь).Исходя из его разъяснения, он / она хочет не удалять дублирующиеся слова из строки, а дублировать слова рядом друг с другом.
До: table desk chair chair book chair candle lamp lamp desk
После: table desk chair book chair candle lamp lamp desk
Этот процесс прост, но может усложниться.Мой процесс состоит в том, чтобы просто сравнивать каждое слово по предшествующему слову в строке.Это займет Table Chair Chair Desk
или Table Chair Chair Chair Desk
или Table Chair Chair Chair Chair Desk
(вы получите точку) и измените его на Table Chair Desk
.
Поскольку этот скрипт довольно длинный, вы не захотите вставлять его для каждогострока.Удивительное решение для этого - call
.Как я превратил это в функцию.Ниже я объясню, как его использовать.
Команда: Call :RemoveMultipleWords [String You Want Edited] [New String]
Пример: Call :RemoveMultipleWords String Furniture
Пожалуйстаимейте в виду, что вы также можете редактировать оригинальную строку, это тоже само.Это означает, что вместо String Furniture
вы можете поставить String String
.
RemoveOnlyDouble + Instances.bat:
@ECHO OFF
@setlocal EnableDelayedExpansion
Rem | Original String's
Set "Furniture=table desk chair chair book chair candle lamp lamp desk"
Set "Food=Lasagne Fettuccine_Alfredo Carbonara Carbonara Culatello Breadsticks Tortano Tortano"
Rem | Call To Fix Function
Call :RemoveMultipleWords Furniture Furniture
Echo !Furniture!
Call :RemoveMultipleWords Food IntlianFoods
Echo !IntlianFoods!
Rem | Exit BATCH
Pause
Exit /b
:RemoveMultipleWords
Rem | Reset LoopCount
Set "LoopCount=0"
Rem | Process Each Item
for %%A in (!%1!) do (
Rem | Get Current Word
Set "CurrentWord=%%A"
Rem | Set First Word
If "!LoopCount!"=="0" (
Rem | Set LoopCount
Set "LoopCount=1"
Rem | First Run
Set "%2=%%A"
) ELSE (
Rem | Upcoming Runs
If "!LoopCount!"=="1" (
Rem | First Word
Set "LastWord1=%%A"
Rem | Add LoopCount
Set "LoopCount=2"
Rem | Echo Results
If not "!LastWord2!"=="%%A" (Set "%2=!%2! !CurrentWord!")
) ELSE (
Rem | Next Word
Set "LastWord2=%%A"
Rem | Subtract LoopCount
Set "LoopCount=1"
Rem | Echo Results
If not "!LastWord1!"=="%%A" (Set "%2=!%2! !CurrentWord!")
)
)
)
Goto :EOF