按特定順序合併 .txt 文件

按特定順序合併 .txt 文件

我有一組 300 個章節,名為第 1 章.txt、第 2 章.txt...第 300 章.txt]

目標是嘗試建立一個按順序包含所有這些章節的組合 .txt 檔案。

每個文件的格式都是第一行是章節標題,文件的其餘部分是該章節的內容。

我試過

複製 *.txt 新檔案.txt

這產生的 newfile.txt 有兩個問題。

問題 1 - 文件依照第 1 章、第 10 章、第 100 章、第 11 章...的順序排列,與第 1 章、第 2 章、第 3 章...

問題 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 遞增 1)。

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

3.一個帶有 2 個額外數字的預定義變量,為我們提供 1 個或多個前導零,在循環內遞增以在重命名時使用,僅使用最後 4 位數字。

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

4.附加for /F循環將按照遵循循環的正確順序列出每個文件,for /L也按照 1 到 300 的順序。

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.當雙循環的執行完成後,執行 useecho在每個文件的末尾添加額外的行...

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

7.完成上述所有處理後,您就可以執行命令並獲得所需的結果:

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

  • 觀察:我不知道你的文件是什麼編碼,但我想/b內部副本不會覆蓋最後一行。
@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%"

相關內容