如何将.txt的第一行与第二行.txt中的第一行连接起来,依此类推

时间:2016-12-01 13:10:18

标签: batch-file for-loop concatenation

我想将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
    )
)

3 个答案:

答案 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
)