отдельные токены в командном файле - PullRequest
1 голос
/ 22 февраля 2012

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

Мой текстовый файл с разделением табуляцией выглядит примерно так:

ABC     1000     GHY_GGG
ADD     2000     
ABCSS     3000     JJY_GGG

Мой код ниже:

for /f "tokens=* usebackq delims= " %%a in ("%TraderWorkspaceFile%") do (
set line=%%a

call :processToken
)
goto :eof

:processToken

  for /f "tokens=1 delims= " %%f in ("%line%") do (      
   echo Got one token: %%f
  )

goto :eof

Спасибо!

Ответы [ 2 ]

6 голосов
/ 22 февраля 2012

Команда FOR / F читает строки файла и разделяет их в токены в соответствии с параметром "tokens = delims =".По умолчанию «токены» относятся только к первому токену в строке, а «разделители» включают пробелы и символы табуляции (если они не указаны).Эта команда FOR:

for /f "usebackq" %%a in ("%TraderWorkspaceFile%") do echo %%a

будет показывать:

ABC
ADD
ABCSS

, тогда как

for /f "tokens=2 usebackq" %%a in ("%TraderWorkspaceFile%") do echo %%a

будет показывать:

1000
2000
3000

Обратите внимание, что«delims =» совпадает со значением по умолчанию, поэтому он бесполезен, но «delims =» (без разделителей) - это трюк, заключающий в первый токен всю строку.

for /f "usebackq delims=" %%a in ("%TraderWorkspaceFile%") do (
set line=%%a
call :processToken
)
goto :eof

:processToken
  for /f "tokens=1 delims= " %%f in ("%line%") do (      
   echo Got one token: %%f
  )
goto :eof

будет правильно отображатьсяпервый токен каждой строки , хотя:

:processToken
  for /f %%f in ("%line%") do (      
   echo Got one token: %%f
  )
goto :eof

будет делать то же самое ...

Вы также можете получить отдельный пробел или табуляциюразделить токены через параметры подпрограммы следующим образом:

:processLine
echo First token: %1, second token: %2, third one: %3
goto :eof

, который должен быть вызван следующим образом (вместо call: processToken):

call :processLine %line%
2 голосов
/ 22 февраля 2012

Вы говорите, что ваш файл <tab> разделен, но мне кажется, что ваш параметр "delims" установлен на <space>. Если я прав, то вы можете исправить вашу проблему, изменив пробел после "delims =" на вкладку. Или, что еще лучше, если ни одно из ваших значений не имеет пробелов, вы можете просто полностью удалить опцию разделителей, поскольку разделителями по умолчанию являются <space> и <tab>.

Предполагая, что вы можете отсортировать первый токен, просто расширить код для анализа всех 3 токенов. Просто измените на "токены = 1-3". Токен 1 будет в %% f, токен 2 в %% g и токен 3 в %% h.

Кстати, я не понимаю, почему вы используете 2 цикла. Кажется, вы можете анализировать токены непосредственно в первом цикле FOR. Если код, который вы разместили, не является упрощением вашего реального кода, и вы планируете что-то делать со всей строкой;)

...