貼り付けの答えは完璧な解決策のように聞こえます。
しかし、誰か (OP ではない) が、実行可能ファイルのダウンロードを必要としないネイティブ ソリューションを必要とする場合があります。このようなことは、VBScript や JScrpt などのより強力なスクリプト言語で行う必要があります。
しかし、私はバッチで物事を解決するという課題が好きなので、楽しみのために、ネイティブのバッチ ソリューションに挑戦してみようと思いました。
OPは、「各ファイルから行を読み取るループを作成することでこれを行うことができるようになりました」と述べました。バッチを使用すると、言うは易く行うは難しです!
通常、ファイルは FOR /F を使用して読み取られますが、FOR /F を使用して複数のファイルからの読み取りをインターリーブする適切な方法はありません。他の唯一のネイティブな代替手段は、リダイレクトされた入力で SET /P を使用することです。この手法には、次の制限があります。
- 入力ファイルでは、Windows スタイルの行末記号を使用する必要があります。
<carriage return><line feed>
- 入力行の長さは 1021 バイトを超えることはできません (行末記号は無視します)。
- 末尾の制御文字は各入力行から削除されます
さらに、最終的にマージされた各行は、バッチ変数の長さの制限である最大 8k バイトを超えてはなりません。
最後にもう 1 つ制限があります。スクリプトは最大 7 つの入力ファイルしか処理できません。7 つを超えるファイルが指定されている場合、スクリプトは失敗します。エラー チェックは含まれていません。
これが実際に動作するバッチ スクリプトです。「merge.bat」と呼びます。注 - このバッチ ソリューションは、貼り付けや VBScript または JScript で記述されたスクリプトなどの他のソリューションよりもはるかに低速です。しかし、それは機能します:-)
@echo off
setlocal disableDelayedExpansion
::Initialization
set "inputRedirection="
set "files=2"
set "lines=0"
for %%F in (%*) do call :setInputRedirection
setlocal enableDelayedExpansion
set "inputRedirection=!inputRedirection:::=<!"
::Merge the files
%inputRedirection% (
for /l %%N in (1 1 %lines%) do (
set "ln="
for /l %%I in (3 1 %files%) do (
call :readLine %%I
if %%I neq %files% (
set "ln=!ln!!input!:"
) else (
echo(!ln!!input!
)
)
)
)
exit /b
:setInputRedirection
set /a "files+=1"
for %%A in (1) do (
set inputRedirection=%files%::"%%~F" %inputRedirection%
for /f %%N in ('find /c /v "" ^<"%%~F"') do if %%N gtr %lines% set "lines=%%N"
)
exit /b
:readLine fileHandle
set "input="
<&%1 set /p "input="
exit /b
ファイルをマージするには、次のようにします。
merge.bat file1.txt file2.txt file3.txt >output.txt