.txt ファイルを特定の順序で結合する

.txt ファイルを特定の順序で結合する

私は Chapter 1.txt、Chapter 2.txt...Chapter 300.txt という名前の 300 章のセットを持っています。

目標は、これらすべての章を順番にまとめた .txt ファイルを作成することです。

各ファイルは、最初の行が章のタイトル、ファイルの残りの部分が章の内容になるようにフォーマットされています。

私は試した

*.txt を newfile.txt にコピーします

これにより、2 つの問題を含む newfile.txt が生成されました。

問題 1 - ファイルは、第 1 章、第 2 章、第 3 章... の順序ではなく、第 1 章、第 10 章、第 100 章、第 11 章... の順序で並べられていました。

問題 2 - 前述のように、各ファイルの最初の行はタイトルです。これらのファイルを結合すると、前の章の最後の行が次の章の章タイトルと同じ行に配置されます。

上記を修正するにはどうすればいいでしょうか?

答え1

@echo off

cd /d "%~dp0" && set "_c=10000" && setlocal enabledelayedexpansion

for /l %%L in (1 1 300)do for /f tokens^=1* %%i in ('%__AppDir__%where.exe .:Chapter?%%~L.txt')do (
    set /a "_c+=1" && call set "_new=Chapter !_c:~-4!.txt" && rename ".\Chapter?%%~L.txt" "!_new!")

for /f tokens^=* %%i in ('%__AppDir__%where.exe .:Chapter*.txt')do echo;>>"%%~dpnxi"
copy ".\Chapter*.txt" ".\newfile.txt" & endlocal 

  • .\renameファイルを、数字だけでなく英数字の順序に従って並べ替えることができます。

1.ファイルがあるフォルダーのフルパスに置き換えます。

cd /d "%~dp0" cd /d  "D:\Full\Path\To\Folder

2.ループを使用して、1 から 300 までの順序を取得します (1 の場合は 1 ずつ増加します)。

for /l %%L in (1 1 300)do ...

3.1 つ以上の先頭のゼロを提供するための 2 つの追加桁を持つ定義済み変数。名前変更時に使用するループ内で増分され、最後の 4 桁のみになります。

set "_c=10000" 
set /a "_c+=1" && call set "_new=Chapter !_c:~-4!.txt"

4.追加のループにより、各ファイルが1 から 300 の順序でループfor /Fに従って正しい順序でリストされます。for /L

for /f tokens^=1* %%i in ('%__AppDir__%where.exe .:Chapter?%%~L.txt')do 

5.ループ内で変数を増分し、部分文字列を使用してファイル名をゼロで始まるmに変更します。

:: Original Name    <==>   New File Name
:: -----------------------------------------
:: Chapter 1.txt    <==>   Chapter 0001.txt
:: Chapter 10.txt   <==>   Chapter 0010.txt
:: Chapter 100.txt  <==>   Chapter 0100.txt

set "_c=10000"
 
set /a "_c+=1" && call set "_new=Chapter !_c:~-4!.txt"

rename ".\Chapter?%%~L.txt" "!_new!"

6.二重ループの実行が終了したら、echo各ファイルの末尾に追加の行を追加するために実行します...

for /f tokens^=* %%i in ('%__AppDir__%where.exe .:Chapter*.txt')do echo;>>"%%~dpnxi"

7。上記の処理がすべて完了したら、コマンドを実行して目的の結果を取得する準備が整います。

copy ".\Chapter*.txt" ".\newfile.txt"

  • 観察:ファイルのエンコードが何であるかはわかりませんが、/binary コピーでは最後の行が上書きされないと思います。
@echo off

cd /d "%~dp0" && set "_c=10000" && setlocal enabledelayedexpansion

for /l %%L in (1 1 300)do for /f tokens^=1* %%i in ('%__AppDir__%where.exe .:Chapter?%%~L.txt')do (
    set /a "_c+=1" && call set "_new=Chapter !_c:~-4!.txt" && rename ".\Chapter?%%~L.txt" "!_new!")

copy /b ".\Chapter*.txt" ".\newfile.txt" & endlocal 

追加リソース:

答え2

バッチを txt ファイルがあるフォルダーにコピーして実行します。

@echo off

:: Set the name of the new concatenated file here:
set NewFile=NewFile.txt

If not exist "%NewFile%" copy NUL "%NewFile%"

for /L %%a in (1,1,300) do If exist "%Chapter %%a.txt" copy "%NewFile%" + "Chapter %%a.txt"& echo.>>"%NewFile%" &echo.>>"%NewFile%"

関連情報