我想将txt文件的第一行与另一个txt文件的第一行连接起来。第二个与第二个等等。 现在我有以下代码,它连接每一行的每一行。使用此代码,我得到所有4种组合,但我只需要2
for /f "delims=" %%c in (barcode.txt) do (
for /f "delims=" %%d in (destination.txt) do (
>>combine.txt echo %%c %%d
)
)
答案 0 :(得分:3)
这确实有其局限性,但适用于行长度不超过1023的文件。
@echo off
setlocal enabledelayedexpansion
< file2.txt (FOR /F "delims=" %%G IN (file1.txt) DO (
set /p file2=
echo %%G !file2!
)
)
pause
答案 1 :(得分:2)
以下脚本使用两个嵌套的for /F
循环,其中内部循环放在子例程:SUB
中。全局索引变量$INDEX
计算外部循环的交互,因此它反映了相关文件的已处理行的数量。此索引用于内部循环,以定义要跳过的相关文本文件的行数(skip
选项for /F
);然后在第一次迭代时保留循环,因此只读取一行,即与当前从外循环读取的索引具有相同索引的行。这比Squashman method更复杂,更慢,但它不会混淆不同的方法来读取文件(for /F
和输入重定向):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set /A "$INDEX=0"
for /F usebackq^ delims^=^ eol^= %%J in ("barcode.txt") do (
set "LINE=%%J"
set /A "$INDEX+=1"
call :SUB TEXT "destination.txt"
setlocal EnableDelayedExpansion
echo(!LINE! !TEXT!
endlocal
)
endlocal
exit /B
:SUB rtn_line_text val_file_path
set /A "SKIP=$INDEX-1"
if %SKIP% LEQ 0 (set "SKIP=") else (set "SKIP=skip^=%SKIP%")
for /F usebackq^ %SKIP%^ delims^=^ eol^= %%I in ("%~2") do (
set "%~1=%%I"
exit /B
)
exit /B
将批处理文件的输出重定向(>
)到文本文件以获得所需的组合文件。
以下是对两个文件使用输入重定向(<
)的替代方法。如果两个文件的行都为空,则goto
循环中断,因此脚本终止:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
4< "barcode.txt" 3< "destination.txt" call :SUB
endlocal
exit /B
:SUB
set "LINE1=" & set "LINE2="
<&4 set /P "LINE1="
<&3 set /P "LINE2="
if not defined LINE1 if not defined LINE2 exit /B
setlocal EnableDelayedExpansion
echo(!LINE1! !LINE2!
endlocal
goto :SUB
答案 2 :(得分:-1)
这是因为您正在嵌套for循环。仅使用外循环。编写一个从第二个文件返回第n行的函数或例程,并使用for循环中创建的计数器来检索匹配行。虽然我不熟悉批处理语法,但这是一般的想法:
rem initialize variable i = 1
for /f "delims=" %%c in (barcode.txt) do (
rem write f(index): returns the line number index from the second file
rem then concatenate the lines
rem and then increment i
)