需要代币和熟食专家的帮助
tokens and delims expert help needed
我最近一直在大量使用批处理,在我的工作中取得了很好的效果,并且也在一些地方使用了一些功能 shell,效果很好。
总是让我感到困惑的一件事是通过循环等工作时的令牌和 delims 概念。我看过你的管视频并阅读了经典的 rob van 页面。我有点明白,但是当我需要使用它时,它并不基本。
我举了一个例子,如果有人足够友好地解释你如何选择令牌和 delims 的数量,那将非常有帮助。我需要从网页的各个列中推断出 PC 主机名。我可以将文本复制到文本板中,并希望 "echo out" 到另一个文件中,只是计算机名称。
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
)
)
所以我的想法(大声笑)...我希望将 4,5 个标记(第 4 列和第 5 列)提取到 %%J 我希望下一个循环回显附加标记以及主机名,所以仍然使用 '。'作为此测试中第 4 行和第 5 行的分隔符,我相信现在有 6 个标记可供选择....但输出仍然只显示主机名...我没有得到什么
ID006962(t1).CENTRAL(t2) 3(t3).10(t4).6(t5).0(t6)
@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
参数并重试。
"Nov","2016","09:45","GMT"每个都没有第二个token,所以shift
“194.176.105.132”的第二个标记“176”不匹配,所以 shift
"United","Kingdom" 没有第二个标记,所以 shift
"ID006962.CENTRAL" 有第二个标记,它匹配 "CENTRAL",所以打印第一个,"ID006962" 并走到最后,放弃其余参数“3.10.6.0”和 "Remove"
请注意,Central African Republic
之类的字符串不会通过测试,因为 CENTRAL
的匹配区分大小写,而 "Central"
没有第二个标记。
请注意,某些语法元素对布局敏感。建议使用文本编辑器进行剪切和粘贴,而不是文字处理器,后者可能会默默 "format" 代码。请注意 NOTEPAD
也倾向于格式化代码。我使用 EDITPLUS
.
您的数据似乎是 TAB 分隔的 table,由六列组成。您要提取的部分字符串位于第四列。因此,让我们使用 for /F
循环来获取第四个标记(请注意,在 delims=
之后有一个 TAB 字符):
for /F "usebackq tokens=4 delims= " %%J in ("inputfile.txt") do echo(%%J
这会提取像 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
)
)
两种可能的解决方案。
第一个使用与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 的输出文件名以适合您的目的。
我最近一直在大量使用批处理,在我的工作中取得了很好的效果,并且也在一些地方使用了一些功能 shell,效果很好。
总是让我感到困惑的一件事是通过循环等工作时的令牌和 delims 概念。我看过你的管视频并阅读了经典的 rob van 页面。我有点明白,但是当我需要使用它时,它并不基本。
我举了一个例子,如果有人足够友好地解释你如何选择令牌和 delims 的数量,那将非常有帮助。我需要从网页的各个列中推断出 PC 主机名。我可以将文本复制到文本板中,并希望 "echo out" 到另一个文件中,只是计算机名称。
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
)
)
所以我的想法(大声笑)...我希望将 4,5 个标记(第 4 列和第 5 列)提取到 %%J 我希望下一个循环回显附加标记以及主机名,所以仍然使用 '。'作为此测试中第 4 行和第 5 行的分隔符,我相信现在有 6 个标记可供选择....但输出仍然只显示主机名...我没有得到什么
ID006962(t1).CENTRAL(t2) 3(t3).10(t4).6(t5).0(t6)
@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
参数并重试。
"Nov","2016","09:45","GMT"每个都没有第二个token,所以shift
“194.176.105.132”的第二个标记“176”不匹配,所以 shift
"United","Kingdom" 没有第二个标记,所以 shift
"ID006962.CENTRAL" 有第二个标记,它匹配 "CENTRAL",所以打印第一个,"ID006962" 并走到最后,放弃其余参数“3.10.6.0”和 "Remove"
请注意,Central African Republic
之类的字符串不会通过测试,因为 CENTRAL
的匹配区分大小写,而 "Central"
没有第二个标记。
请注意,某些语法元素对布局敏感。建议使用文本编辑器进行剪切和粘贴,而不是文字处理器,后者可能会默默 "format" 代码。请注意 NOTEPAD
也倾向于格式化代码。我使用 EDITPLUS
.
您的数据似乎是 TAB 分隔的 table,由六列组成。您要提取的部分字符串位于第四列。因此,让我们使用 for /F
循环来获取第四个标记(请注意,在 delims=
之后有一个 TAB 字符):
for /F "usebackq tokens=4 delims= " %%J in ("inputfile.txt") do echo(%%J
这会提取像 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
)
)
两种可能的解决方案。
第一个使用与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 的输出文件名以适合您的目的。