Войти

Показать полную графическую версию : [решено] Некорректный разбор строки


RedScorpio
04-06-2009, 11:24
Пытаюсь в командном файле разобрать строку (это только для примера)

@echo off

set STRING="1;2;3;4"
echo %STRING%

for /F "tokens=1,2,3,4 delims=;" %%a in (%STRING%) do (
set V1=%%a
set V2=%%b
set V3=%%c
set V4=%%d
)

echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%

Все работает корректно

Но если строка выглядит как STRING="1;;3;4", значения переменных "съезжают" (т.е. пустой будет переменная V4, а не V2).

Как сделать правильный разбор строки, не меняя ее формата?

gora
04-06-2009, 11:46
Как сделать правильный разбор строки, не меняя ее формата? »
Попробуйте так:@echo off
setlocal enabledelayedexpansion
set STRING=1;;3;4
echo %STRING%
set STRING=#%STRING:;=;#%

for /F "tokens=1,2,3,4 delims=;" %%a in ("%STRING%") do (
set V1=%%a
set V1=!V1:~1!
set V2=%%b
set V2=!V2:~1!
set V3=%%c
set V3=!V3:~1!
set V4=%%d
set V4=!V4:~1!
)

echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%
Pause

RedScorpio
04-06-2009, 12:16
Цитата gora:
Попробуйте так:

Да, так работает. Но, к сожалению, это уже изменение формата разбираемой строки (STRING=1;;3;4).
В примере строка была упрощена. В реальности может быть с пробелами, поэтому кавычки обязательны (STRING="text 1;;text 3;text 4"

Но идея мне понравилась

@echo off

set STRING="1;;3;4"
set STRING=%STRING:;;=;#;%
echo %STRING%

for /F "tokens=1,2,3,4 delims=;" %%a in (%STRING%) do (
set V1=%%a
set V2=%%b
set V3=%%c
set V4=%%d
)

echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%


Дальше буду просто отбрасывать #

Спасибо

Рано обрадовался

При STRING="1;;;4" уже не работает.

Как бы set STRING=%STRING:;;=;#;% "засунуть" в цикл?

gora
04-06-2009, 12:29
В реальности может быть с пробелами »
Тогда попробуйте так:@echo off
set "STRING=text 1;;;text 4"
echo %STRING%
set temp_STRING="#%STRING:;=;#%"

for /F "tokens=1,2,3,4 delims=;" %%a in (%temp_STRING%) do (
set V1=%%a
set V2=%%b
set V3=%%c
set V4=%%d
)
set V1=%V1:~1%
set V2=%V2:~1%
set V3=%V3:~1%
set V4=%V4:~1%

echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%
Pause Работает и с пробелами.

Еще вариант. Ваша переменная STRING в кавычках и остается в неизменном виде:@echo off
set STRING="text 1;;;text 4"
echo %STRING%
for /d %%i in (%STRING%) do set "temp_STRING=%%~i"

set temp_STRING="#%temp_STRING:;=;#%"

for /F "tokens=1,2,3,4 delims=;" %%a in (%temp_STRING%) do (
set V1=%%a
set V2=%%b
set V3=%%c
set V4=%%d
)
set V1=%V1:~1%
set V2=%V2:~1%
set V3=%V3:~1%
set V4=%V4:~1%

echo var1=%V1%
echo var2=%V2%
echo var3=%V3%
echo var4=%V4%
Pause

RedScorpio
04-06-2009, 12:55
Работает.

Но опять изменение формата
set "STRING=text 1;;;text 4"

Строка set STRING="text 1;;;text 4" должна быть неизменной. В реальности она читается из файла конфигурации, который используется многими другими скриптами. Проблема возникла после того, как появилась необходимость читать этот файл под Windows (под Linux используется скрипт с awk/gawk)

Т.е. нужно решить вопрос:

Как бы set STRING=%STRING:;;=;#;% "засунуть" в цикл?

Цитата gora:
В посте выше есть второй вариант!

Не сразу появился. :)
Не сообразил, что предварительно можно избавиться от кавычек

Спасибо.

ldap
03-06-2011, 17:52
возможно тема безнадежно устарела, но я все равно напишу свое предложение по этой проблеме.
Идея состоит в том чтобы в вашем примере заменить тело цыкла do (...) на вызов процедуры.
в этом варианте все красиво работает. переменная не выводит постоянно последнее значение наружного цыкла:

мой пример несколько отличается, но смысл тот же:
здесь поднимается файл, в котором перечислены полные пути типа d:\folder1\folder2\folder3.....
пример перебирает строки из этого файла и передает их параметром на обработку в некую процедуру (в этом случае вынимаются слэши из строки).

@echo off
set wd=.\
set bd=.\backups

for /F %%a in (backuper.cnf) do CALL :getFolder %%a

goto :EOF

:getFolder
echo BackupTaskAbout: %1
FOR /F "eol=; tokens=2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 delims=\" %%i in ("%1") do set s=%%i %%j %%k %%l %%m%%n%%o%%p%%q%%r%%s%%t%%u%%v%%w
echo folder %s%
goto :EOF




© OSzone.net 2001-2012