Tengo un conjunto de 300 capítulos llamados Capítulo 1.txt, Capítulo 2.txt... Capítulo 300.txt]
El objetivo es intentar crear un archivo .txt combinado con todos estos capítulos en orden.
Cada archivo tiene un formato en el que la primera línea es el título del capítulo y el resto del archivo es el contenido del capítulo.
Lo intenté
copiar *.txt nuevoarchivo.txt
Esto generó newfile.txt con dos problemas.
Número 1: Los archivos se organizaron en el orden Capítulo 1, Capítulo 10, Capítulo 100, Capítulo 11... como se supone que es el Capítulo 1, Capítulo 2, Capítulo 3...
Problema 2: como se mencionó, la primera línea de cada archivo es el título. Cuando estos archivos se fusionaron, la última línea del capítulo anterior se coloca en la misma línea que el título del capítulo siguiente.
¿Cómo solucionaría lo anterior?
Respuesta1
@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
- Puede
.\rename
ordenar sus archivos en un orden que cumpla con una secuencia alfanumérica, no solo numérica.
1.Reemplace con la ruta completa de la carpeta donde tiene sus archivos.
cd /d "%~dp0" cd /d "D:\Full\Path\To\Folder
2.Utilice un bucle para obtener el orden en el que pasa de 1 a 300 (1 en 1 incrementando en 1).
for /l %%L in (1 1 300)do ...
3.Una variable predefinida con 2 dígitos adicionales para darnos 1 o más ceros iniciales, incrementándose dentro del bucle para usar al cambiar el nombre, solo los últimos 4 dígitos.
set "_c=10000"
set /a "_c+=1" && call set "_new=Chapter !_c:~-4!.txt"
4.Un bucle adicional for /F
enumerará cada archivo en el orden correcto obedeciendo el for /L
bucle también en orden del 1 al 300.
for /f tokens^=1* %%i in ('%__AppDir__%where.exe .:Chapter?%%~L.txt')do
5.Con la variable incrementada en el bucle, use la subcadena para cambiar el nombre de sus archivos liderados por ceros
:: 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.Cuando finalicen las ejecuciones del doble bucle, ejecute use echo
para agregar la línea adicional al final de cada uno de sus archivos...
for /f tokens^=* %%i in ('%__AppDir__%where.exe .:Chapter*.txt')do echo;>>"%%~dpnxi"
7.Después de todo el procesamiento anterior, está listo para ejecutar su comando y obtener el resultado deseado:
copy ".\Chapter*.txt" ".\newfile.txt"
- Obs.:No sé cuál es la codificación de sus archivos, pero supongo que una
/b
copia binaria no sobrescribe la última línea.
@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
Recursos adicionales:
Respuesta2
Copie el lote a la carpeta donde están los archivos txt y ejecute:
@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%"