我想相应地从2个不同的文件中提取变量。
意味着如果fileA具有这些值
FIRST
SECOND
THIRD
而fileB有
A
B
C
它应该出现:
FIRST, A
SECOND, B
THIRD, C
这是我到目前为止编码的内容:
for /f "tokens=*" %%a in (%FileA%) do (
for /f "tokens=*" %%i in (%FileB%) do (
echo %%i, %%a
)
)
但是它不会正确匹配,这意味着它将是:
FIRST, A
FIRST, B
FIRST, C
SECOND, A
SECOND, B
SECOND, C
THIRD, A
THIRD, B
THIRD, C
答案 0 :(得分:3)
当您通过for /F
循环阅读一个文本文件时,您可以同时阅读两个文本文件,而set /P
和input redirection阅读另一个文本文件,如下所示:
setlocal EnableDelayedExpansion
< "fileB.txt" (
for /F "usebackq delims=" %%L in ("fileA.txt") do (
set "LINE=" & set /P LINE=""
echo(%%L, !LINE!
)
)
endlocal
要使上述代码生效,以下限制适用:
fileA.txt
不得包含超过约8190字节/字符的行; fileB.txt
不得包含长度大于1021字节/字符的行; fileA.txt
定义了从两个文件中读取的行数,因此如果包含更多行,则可能会忽略fileB.txt
行,如果包含少于fileA.txt
,则可以假定为空行。 ; fileA.txt
不应包含空行,因为for /F
; fileA.txt
不应包含以;
开头的行,因为for /F
由于其默认eol
选项而被忽略; fileA.txt
不应包含!
,因为这可能会丢失或导致意外结果,因为在for /F
变量引用%%L
的扩展期间启用了延迟变量扩展; 要克服上述最后三个限制,您可以使用以下代码:
setlocal DisableDelayedExpansion
< "fileB.txt" (
for /F "delims=" %%L in ('findstr /N "^" "fileA.txt"') do (
set "LINEA=%%L"
set "LINEB=" & set /P LINEB=""
setlocal EnableDelayedExpansion
echo(!LINEA:*:=!, !LINEB!
endlocal
)
)
endlocal
以下是它的工作原理:
findstr /N
在每个匹配行前面都有一个行号和:
,搜索字符串^
与所有行匹配,因此fileA.txt
的任何一行都不会显示为空{{1} }},for /F
; for /F
显示为第一个字符,因此;
不再忽略以该字符开头的fileA.txt
行; for /F
变量引用for /F
的扩展期间不再启用延迟变量扩展,但仅在实际需要时,包含%%L
的行不再有问题;