批处理文件中的单独令牌

时间:2012-02-21 22:01:03

标签: batch-file dos

我有以下代码来获取每个文件的第一个标记,但它不起作用。请让我知道出了什么问题,以及我如何能够单独获取该行的每个其他标记。

我的标签分隔的txt文件如下所示:

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 个答案:

答案 0 :(得分:6)

FOR / F命令读取文件的,并根据“tokens = delims =”选项将它们分隔在令牌中。默认情况下,“标记”仅指行中的第一个标记,“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 =”(无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%

答案 1 :(得分:2)

您说您的文件已<tab>分开,但我认为您的“delims”选项设置为<space>。如果我是正确的,那么您可以通过将“delims =”之后的空格更改为选项卡来解决您的问题。或者更好的是,如果您的值没有空格,那么您可以完全删除delims选项,因为默认分隔符为<space><tab>

假设您可以将第一个令牌排序,那么扩展您的代码以解析所有3个令牌很简单。只需更改为“令牌= 1-3”。令牌1将位于%% f中,令牌2位于%% g中,令牌3位于%% h。

顺便说一句,我不明白你为什么要使用2个循环。看起来你可以直接在第一个FOR循环中解析出令牌。除非您发布的代码是对实际代码的简化,并且您计划对整行执行某些操作;)