我想按照一个模式合并两个.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
我继续研究,但是我发现并没有很多东西可以指向正确的方向,所有的帮助都值得赞赏。
答案 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
限制是:
%%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