令牌和delims需要专家帮助

时间:2016-11-24 10:41:29

标签: loops batch-file cmd token

我最近一直在批量使用我的工作,并且在这里和那里的一点点动力贝壳效果很好。

总是让我困惑的一件事是在循环等工作时的令牌和delim概念。我看过你管视频并阅读经典的抢劫车页面。我有点得到它,但是当我需要使用它时,它不是基本的。

我有一个例子,如果有人能够解释你如何选择令牌和delim的数量,那将会非常有用。我需要从网页的各个列中推断出PC主机名。我可以将文本复制到文本板中,并希望“回显”到另一个文件中,只是计算机名称。

24 Nov 2016 09:45 GMT   194.176.105.132 United Kingdom  ID006962.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:44 GMT   194.176.105.154 United Kingdom  ID006976.CENTRAL    3.10.5.0    Remove
24 Nov 2016 09:43 GMT   194.176.105.146 United Kingdom  ID007634.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:41 GMT   194.176.105.138 United Kingdom  ID006961.CENTRAL    3.10.6.0    Remove
24 Nov 2016 09:28 GMT   194.176.105.132 United Kingdom  ID007643.CENTRAL    3.10.5.0    Remove

计算机名称是 ID0006962 数字但我不需要尾随 .CENTRAL 。从这篇文章中我只需要另一个带有主机名的文本文件。我可以完成所有这一部分,它只是推断数据元素。有时列表很大,只需保存到文本文件中运行for循环就可以了,并且只用主机名吐出另一个文本文件。我想如果我能更多地了解这一点,我可以将这些知识应用到我需要做的其他事情上。非常感谢任何提示!

另一个文本文件中的示例输出(我想): -

ID006967                                                             
ID007566                                                               
ID007567                                                              
ID006976    
ID007643     

编辑如何在主机名

旁边获取3.10.6.0等
ID006967     3.10.6.0                                                         
ID007566     3.10.6.0                                                          
ID007567     3.10.6.0                                                         
ID006976     3.10.6.0
ID007643     3.10.6.0

我已经走了但是迷路了,这就是我想的......

@echo off

> "%~dp0test.txt" (
    for /F "usebackq tokens=4,5 delims= " %%J in ("%~dp0rob.txt") do @(
        for /F "tokens=1,3,4,5,6 delims=." %%I in ("%%J") do @echo(%%I
    )
)

所以我的想法(LOL)......我希望将4,5个令牌(第4列和第5列)提取到%% JI中,希望下一个循环能够回显其他令牌以及主机名,因此仍然使用' “。作为此测试的分隔符,第4行和第5行我相信现在有6个令牌可供选择....但是输出仍然只是显示主机名...我得不到什么

ID006962(t1).CENTRAL(t2)3(t3).10(t4).6(t5).0(t6)

3 个答案:

答案 0 :(得分:2)

您的数据似乎是一个由 TAB 分隔的表,由六列组成。要提取的部分字符串位于第四列。因此,让我们使用delims=循环来获取第四个标记(请注意for /F "usebackq tokens=4 delims= " %%J in ("inputfile.txt") do echo(%%J 之后有一个 TAB 字符):

ID0006962.CENTRAL

这会提取for /F之类的字符串。现在让我们用另一个for /F "tokens=1 delims=." %%I in ("ID0006962.CENTRAL") do echo(%%I 循环分割这个字符串:

> "outputfile.txt" echo(ID0006962

然后让我们使用重定向将数据输出到文本文件:

> "outputfile.txt" (
    for /F "usebackq tokens=4 delims=   " %%J in ("inputfile.txt") do @(
        for /F "tokens=1 delims=." %%I in ("%%J") do @echo(%%I
    )
)

最后,让我们把所有这些东西放在一起,以获得一个有效的脚本:

public class GlobalTransformer : ITransformer
{
     private readonly IList<ITransformer> _availableTransformers;

     public GlobalTransformer(IList<ITransformer> availableTransformers)
     {
         _availableTransformers = _availableTransformers;
     }

     public List<MyClass> override Transform(MyClass item) {
        List<MyClass> result = new List<MyClass>();
        foreach (var item in _availableTransformers) {
           result.AddRange(item.Transform(item));
        }
        return result;
     }
}

答案 1 :(得分:2)

两种可能的解决方案。

第一个使用与aschipfl的答案相同的想法稍微更精致,记得delims = TAB

@(For /f "UseBackQTokens=4Delims=   " %%A In ("pagedata.txt"
) Do @Echo=%%~nA)>another.txt

第二个使用句点作为分隔符:

@(For /f "UseBackQTokens=4Delims=." %%A In ("pagedata.txt"
) Do @For %%B In (%%A.x) Do @If Not "%%~xB"=="" Echo=%%~nB)>another.txt

只需更改pagedata.txt的输入文件名和another.txt的输出文件名即可。

答案 2 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q40784266.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO CALL :process %%a
)>"%outfile%"

GOTO :EOF

:process
FOR /f "tokens=1,2delims=." %%q IN ("%1") DO IF "%%r" equ "CENTRAL" (
 echo %%q
 GOTO :eof
) ELSE (
 SHIFT
 GOTO process
)

GOTO :eof

您需要更改sourcedir的设置以适合您的具体情况。 您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为q40784266.txt的文件,其中包含我的测试数据。

生成定义为%outfile%

的文件

将输入文件的每一行读取到%%a并调用:process将整行作为参数传递。

:process接受提供的第一个参数(24)并尝试使用.作为分隔符解析为令牌。如果第二个令牌(在%%r中)不是“CENTRAL”,则shift参数,然后重试。

“11月”,“2016”,“09:45”,“GMT”每个都没有第二个令牌,所以班次
“194.176.105.132”有第二个标记“176”,它不匹配,所以移位
“联合”,“王国”没有第二个标记,所以转移
“ID006962.CENTRAL”有第二个标记,它匹配“CENTRAL”,所以打印第一个“ID006962”并结束,放弃其余参数“3.10.6.0”和“删除”

请注意,Central African Republic等字符串不会失败,因为CENTRAL的匹配区分大小写,而"Central"无论如何也没有第二个令牌。

请注意,某些语法元素是布局敏感的。建议使用文本编辑器进行剪切和粘贴,而不是可以静默“格式化”代码的文字处理器。请注意,NOTEPAD也倾向于格式化代码。我使用EDITPLUS