Объединить файлы .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.После завершения выполнения двойного цикла выполните команду use, 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%"

Связанный контент