2015-11-21 3 views
2

У меня есть строка формата 101514,1,101645,101798. Я хочу разбить строку на ,, а затем прокрутить каждый из отдельных элементов, сравнивая этот элемент с требуемым значением.Разбиение строки и цикл через переменные

set required_value=1024 
for /f "delims=," %%a in ("101514,1,101645,101798") do (
    set found=%%a 
    if "%found%"=="%required_value%" (
     echo true 
    ) else (
     echo false 
    ) 
) 

Здесь, очевидно, рассматривается только первая часть. Я могу использовать "tokens=1,2,3", а затем %%a, %%b, %%c так, чтобы сравнить, но длина не фиксирована.

Есть ли другой способ решить эту проблему.

+1

Этот вопрос для простой задачи оказался чрезвычайно полезным для многих случаев использования в моей оценке из-за ответов. Методы, продемонстрированные [aschipfl] (http://stackoverflow.com/users/5047996/aschipfl) и [Aacini] (http://stackoverflow.com/users/778560/aacini) в их ответах, являются удивительными, не очень эффективными для этой задачи, но тем не менее действительно стоит изучать их с помощью «эха». Я могу предложить только каждому посетителю посмотреть все ответы. Они все здорово! – Mofi

ответ

4

Предлагаю другой метод без цикла.

@echo off 
setlocal EnableDelayedExpansion 
set "RequiredValue=1024" 
set "ValuesList=101514,1,101645,101798" 
rem Prepend and append a comma on value list. 
set "AllValues=,%ValuesList%," 
rem Use substring replacement to find out if the required 
rem value is included in list of values or is missing in list. 
if "!AllValues:,%RequiredValue%,=!" == "%AllValues%" (
    echo %RequiredValue% not found in %ValuesList% 
) else (
    echo %RequiredValue% is included in %ValuesList% 
) 
endlocal 

Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все справочные страницы отображаются для каждой команды очень тщательно.

  • echo /?
  • endlocal /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
2
  • использование равнину for без /f "delims"
  • не процитировать строки
  • не присваиваемое found переменной, она не будет работать без задержки с расширением внутри цикла, используйте %%a

for %%a in (101514,1,101645,101798) do (
    if "%%a"=="%required_value%" (
     echo true 
    ) else (
     echo false 
    ) 
) 
1

Альтернативный метод использует call запустить подпрограмму, которая использует shift:

set required_value=1024 
set list_of_values=101514,1,101645,101798 

call :SUBSPLIT %list_of_values% 
echo %found% 
exit /B 

:SUBSPLIT 
set found=false 
:LOOP 
if "%1"=="" (
    exit /B 
) else if "%1"=="%required_value%" (
    set found=true 
    exit /B 
) 
shift 
goto :LOOP 

Тип call /? и shift /? в командной строке, чтобы получить информацию о сучке основных команд этого подхода.

2

Очевидным решением является использование простой команды for (без переключателя /F), как предложено wOxxOm.

Более эффективным методом является замена требуемого значения из списка, как описал Мофи в своем ответе.

Существует еще один метод, который работает только тогда, когда значения являются числами. Трюк состоит в том, чтобы собрать арифметическое выражение, которое вычитает требуемое значение из каждого из значений в списке, а затем умножает все частичные результаты; если требуемое значение является одним из списка, результат равен нулю.

@echo off 
setlocal 

set "ValuesList=101514,1,101645,101798" 

rem Create the test function 
set "IsValueInList(x)=(%ValuesList:,=-x)*(%-x)" 

rem Test if a value is in list 
set "RequiredValue=1024" 
set /A "test=%IsValueInList(x):x=RequiredValue%" 

if %test% equ 0 (
    echo true 
) else (
    echo false 
) 

Эта программа использует две интересные трюки: определение «функции» Batch, как описано в this post, и особым образом «разбить строку на разделитель», как описано here.