我最近一直在批量使用我的工作,并且在这里和那里的一点点动力贝壳效果很好。
总是让我困惑的一件事是在循环等工作时的令牌和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
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)
答案 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
的设置以适合您的具体情况。
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为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
。