.bat que cuente los datos de un fichero y elimine las líneas que tengan 72 caracteres solamente.

Crear un .bat que cuente los datos de un fichero y elimine las líneas que tengan 72 caracteres solamente, las líneas que contienen 82 caracteres son correctas y deben permanecer y las que tienen 72 caracteres deben de eliminarse.

1 respuesta

Respuesta
1

Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
del /q salida.txt
for /f "tokens=*" %%a in (entrada.txt) do (
set linea=%%a
set aux=!linea:~72!
if not #!aux!#==## echo %%a>>salida.txt
)

El archivo ENTRADA.TXT sería el fichero de partida y SALIDA.TXT el que contiene solo las líneas con más de 72 caracteres. Seguramente necesitará algún "ajuste fino" una vez que veas como funciona.

Funciona. pero al recorrer todos los registros del archivo (10 mil, aprox), se demora mucho la ejecución,  como se podrá hacer para que el for se salte los demás registros correctos y solamente elimine los de 72 caracteres ?. Gracias.

No sé que entiendes por "eliminar". Solo se me ocurre copiar en la salida solo los registros de más de 72 caracteres. Y no se me ocurre otra forma de saber si un registro tiene más de 72 caracteres que cargarlo y hacer comprobaciones. Tal vez esto pudiera ser algo más rápido, pero tengo mis dudas:

@echo off
Setlocal EnableDelayedExpansion
del /q salida.txt
for /f "tokens=*" %%a in (entrada.txt) do (
set linea=%%a
set aux=!linea:~72,1!
if not #!aux!#==## echo %%a>>salida.txt
)

Por ejemplo:

La línea 6489 se debe de eliminar(quitar), con el código actual lo realiza, pero se demora demasiado.

Ya, pero ¿cómo quieres que el BAT sepa que esa línea no la debe copiar sin leer todas las líneas? E insisto en que la única forma que se me ocurre de "eliminar" líneas con un BAT es no copiarlas en un archivo de salida. Solo con leer y escribir ya se consume un tiempo y no se me ocurre otra forma de hacerlo.

Perfecto,  me ayudas con el código de la última idea que tienes.

(insisto en que la única forma que se me ocurre de "eliminar" líneas con un BAT es no copiarlas en un archivo de salida).

Gracias

No sé si es una pregunta ("¿me ayudas con el código de la última idea que tienes?") o que ya tienes una idea de por dónde tirar. Si consideras que ya no tengo nada más que hacer por ti, cierra la pregunta.

Me faltó el signo de pregunta, perdón, lo que quise decir es si me puedes ayudar enviándome el código de la última idea que indicaste, con esto ya cierro la pregunta. Muchas gracias.

Hola, por favor equipo todoexpertos,

1. Necesito que este código que se describe más abajo, no genere un nuevo archivo de salida, que la modificación la realice en el archivo original solamente.

@echo off
Setlocal EnableDelayedExpansion
del /q salida.txt
for /f "tokens=*" %%a in (entrada.txt) do (
set linea=%%a
set aux=!linea:~72,1!
if not #!aux!#==## echo %%a>>salida.txt
)

Creo que ya has entendido que eso era, precisamente, lo que hacía el BAT que te propuse. En cuanto a lo que pides me temo que solo podría hacerse con el EDLIN que dejó de existir en las últimas versiones del MSDOS asociado a Windows. En todo caso ni siquiera los editores de texto trabajan sobre el archivo original, aunque pueda parecerlo. Crean uno nuevo y al final, si procede, reescriben el antiguo.

He estado investigando un poco más sobre el asunto y me ratifico en mi comentario. No hay ningún lenguaje que permita editar archivos directamente sobre los archivos, cuando parece hacerse así en realidad se está creando un nuevo archivo que sobreescribe el de partida por lo que el esquema de trabajo que te propuse (leer línea de archivo de entrada, comprobar longitud de la línea, escribir en archivo de salida si supera la longitud) creo que valdría para cualquier lenguaje de programación. Otra cosa es la rapidez con la que hagan el proceso los "productos" obtenidos con cada lenguaje.

A modo de ejemplo te sugiero que pruebes con Powershell, la potente nueva shell de los entornos Windows (y creo que poco conocida). Yo la he usado poco pero siempre he obtenido buenos resultados. Este comando, escrito directamente en una ventana de Powershell, podría conseguir el resultado que se busca:

Get-Content .\entrada.txt | where {$_.length -ge 72} | Out-File .\salida.txt

Para abrir una ventana de Powershell solo tienes que teclear "powershell" en la casilla de "Ejecutar" del Windows que utilices (a partir de Windows XP). Mira a ver si se reducen los tiempos de esa manera. El ".\" que precede a los nombres de archivo puede no ser necesario, dependiendo de los permisos del usuario utilizado.

Otra cosa que se me estaba olvidando, si quieres sobreescribir el archivo original solo tienes que añadir (en el bat) el siguiente comando:

Copy /y salida.txt entrada.txt

Y en Powershell algo similar:

copy salida.txt entrada.txt

Acabo de darme cuenta que falta un detalle en el comando de Powershell. Si no se especifica la codificación de la salida la hace en Unicode en vez de ASCII. Debería ser así:

Get-Content .\entrada.txt | where {$_.length -ge 72} | Out-File .\salida.txt -Encoding ASCII
La pregunta no admite más respuestas

Más respuestas relacionadas