在新行中批量合并两个.txt文件,每行交替一个

时间:2019-06-04 15:58:27

标签: batch-file

我想按照一个模式合并两个.txt文件,该模式使用file1中的一行,添加一个断点,然后紧跟file2中的另一行,然后重复。

我试图在notepad ++的replace函数中解决此问题,但似乎完全超出了范围。我使用批处理(我熟悉的唯一有用的工具)设法使.bat文件通过换行符分开通过行取得了不同的成功,但是我找不到有关如何从每个文件中交替选择一行的信息。一次查看整个文件。

这是我到目前为止拥有的.bat文件:

@Echo off
( for /f "delims=" %%A in (
    'Type 1.txt^&Echo:^&Type 2.txt'
  ) Do @Echo:%%A
) > 3.txt

当前输出格式:

entire file1.txt
entire file2.txt

预期的输出格式:

single line from file1.txt
single line from file2.txt
repeat

我继续研究,但是我发现并没有很多东西可以指向正确的方向,所有的帮助都值得赞赏。

2 个答案:

答案 0 :(得分:0)

解释和执行批处理文件的Windows命令处理器cmd.exe不适用于文本文件处理。它设计用于执行命令和可执行文件。还有许多其他脚本语言比cmd.exe更好地完成此任务。

但是,此小批处理文件在某些​​限制下可用于此任务。

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "LineNumber=0"
for /F usebackq^ delims^=^ eol^= %%I in ("file1.txt") do (
    set /A LineNumber+=1
    set "Line[!LineNumber!]=%%I"
)

set "LineNumber=0"
(for /F usebackq^ delims^=^ eol^= %%I in ("file2.txt") do (
    set /A LineNumber+=1
    call echo(%%Line[!LineNumber!]%%
    echo(%%I
))>"file3.txt"

endlocal

限制是:

  • 两个输入文件中的非空行数必须相等。
  • 两个输入文件不包含空行,由于 FOR 将忽略空行,因此也应将它们写入输出文件。
  • 两个输入文件中的行均不包含感叹号,否则用%%I对命令行进行双重解析时,启用delayed expansion会损坏这些行。
  • 第一个输入文件不太大,无法装入环境变量的内存空间。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?

答案 1 :(得分:0)

如果文件大小不同,将执行此操作。批处理文件计算每个文件中的行数,并比较行数。如果一个文件比另一文件多,那么较短的文件将输出空行,以减少文件中的行数。

个人而言,如果我自己需要此脚本,则可以使用PowerShell修复空白行。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "\\server\folder"

set "InputFile1=File1.txt"
set "InputFile2=File2.txt"
set "OutputFile=mix.txt"
(set Newline=^
%==%
)

if not exist "%InputFile1%" goto EndBatch
if not exist "%InputFile2%" goto EndBatch
del "%OutputFile%" 2>nul

for /F "delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /R /N "^" "%InputFile1%"') do set "LineCount1=%%I"
for /F "delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /R /N "^" "%InputFile2%"') do set "LineCount2=%%I"

rem Exchange input file 1 and 2 if input file 2 has more lines than input file 1.
if %LineCount2% GTR %LineCount1% set "InputFile1=%InputFile2%" & set "InputFile2=%InputFile1%"

(
    for /F usebackq^ delims^=^ eol^= %%I in ("%InputFile1%") do (
        set "LineFile1=%%I"
        setlocal EnableDelayedExpansion
        set /P LineFile2=
        echo(!LineFile1!!Newline!!LineFile2!>>"%OutputFile%"
        endlocal
    )
)<"%InputFile2%"

:EndBatch
popd
endlocal
pause

此脚本还可以很好地处理以分号开头并包含感叹号的行。两个输入文件中只有空行将被忽略,并在输出文件中导致意外的内容。

[Mofi]对此版本进行了一些编辑。

如果您要像我建议的那样使用PowerShell清空行,则将其另存为clearlines.ps1,然后从批处理文件中运行它。

$pathToFile = "\\server\folder"
(Get-Content -Path $pathToFile) -notmatch '(^[\s,-]*$)| (rows\s*affected)' | Set-Content -Path $pathToFile