Como eliminar o evitar el carácter de fin de archivo con el comando copy.

He utilizado el comando copy en un batch para generar un archivo .txt resultante de tres(3) archivos origen y en la ultima posición de la ultima linea del archivo resultante me genera un carácter como un rectángulo. El cual al tratar de leer el archivo desde otra aplicación me genera error por este carácter en el archivo .txt, ¿cómo lo evito?

1 respuesta

Respuesta
1

Imagino que se trata del carácter 0x1A (ASCII 26, Ctrl+Z o ^Z) que creo que se usaba en el MSDOS original para indicar el fin de archivo, antes de que se utilizara la longitud de los archivos para saber hasta dónde llegaban. Y también supongo que cada uno de esos archivos tiene su propio carácter de fin de archivo, por lo que en el archivo final habría que limpiar tres caracteres de este tipo. No sé como has hecho la copia unificadora pero si son archivos ASCII de texto puro el comando copy con la opción "+" te debería limpiar esos caracteres.

Supongamos que tienes tres archivos pba1.txt, pba2.txt y pba3.txt, cada uno de ellos "terminado" con el carácter 0x1A (ASCII 26) y que los unes de la siguiente forma

copy pba1.txt + pba2.txt + pba3.txt pbaT.txt

Esta copia (copia ASCII) eliminaría los caracteres de fin de archivo y el pbaT.txt no tendría ninguno, ni los intermedios ni los finales. En cambio si haces una copia "binaria"

Copy /B pba1.txt + pba2.txt + pba3.txt pbaT.txt te mantendrá esos caracteres.

Si tienes que hacer la copia binaria por alguna razón, dímelo y veremos si podemos hacer algo para eliminarlos. Ya tengo un bat que limpia el fin de archivo si está en una línea aparte pero tiene el inconveniente de que elimina las filas en blanco del archivo original. Si eso no te supone un problema sería este:

:: Elimina ultima línea de un archivo (por ejemplo el fin de archivo 0x1A)
@echo off
Setlocal EnableDelayedExpansion
del kkk.txt
if "%1" == "" goto ayuda
for /f "tokens=*" %%i in ('type %1 ^| find /v /c "" ^< %1') do (set nlin=%%i)
set /a nlin=%nlin%-1
for /f "tokens=*"  %%i in (%1) do (
if "!nlin!" == "0" goto fin
echo %%i>> kkk.txt
set /a nlin=!nlin!-1
)
goto fin
:Ayuda
Echo Elimina la linea final del archivo
Echo Posible problema colateral -> Elimina las lineas en blanco
Echo Formato: %0 archivo
Echo El archivo corregido se deja en kkk.txt
Echo Ejemplo:
echo %0 kk.txt
:Fin

Habría que aplicarlo a cada archivo antes de unirlos.

Ya me dirás.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas