按特定顺序合并 .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.当双循环执行完成后,执行使用echo在每个文件末尾添加额外的行......

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%"

相关内容