2012-02-21 24 views
1

我有以下代码片段来获取每个文件的第一个标记,但它不起作用。请让我知道什么是错的,以及我如何可以单独获取线路的每个其他标记。批处理文件中的单独标记

MY制表符分隔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 

谢谢!

+0

所有问题报告都应该有最小的代码示例,表现出问题(属于您),预期的行为(同样,您提供这个)和_actual_行为(不,不能在任何地方看到):-) – paxdiablo 2012-02-21 22:04:35

回答

6

的FOR/F命令读行文件的令牌按照“令牌= 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 = “(无界限)是在第一个标记中包含整行的一种技巧。

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 

必须调用这种方式(而不是电话:processToken):

call :processLine %line% 
+0

非常感谢Aacini ..帮了很多! – NewQueries 2012-02-22 12:48:55

+0

另外,有没有一种方法可以计算一行中的标记数量? – NewQueries 2012-02-22 13:17:11

+0

如果令牌没有通配符(*?)和分隔符(,; = =),则计数立即:** set n = 0 **然后** for %% a in(%line%)do set/a n + = 1 ** – Aacini 2012-02-23 07:38:23

2

你说你的文件是<tab>分离,但在我看来像你的“delims”选项设置为一个<space>。如果我是正确的,那么可以通过将“delims =”之后的空格更改为选项卡来解决问题。或者更好的是,如果你的值没有空格,那么你可以简单地删除delims选项,因为默认分隔符是<space><tab>

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

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

+0

非常感谢Dbenham ..它的工作! – NewQueries 2012-02-22 12:49:33