¿Cómo eliminar un código dentro de archivo de texto mediante archivo bat?
Tengo un archivo .txt llamado errores.txt. Dentro del archivo hay miles de códigos que son extraídos de un sistema.. Lo que quiero es eliminar todos los códigos que digan ABC+123+FGHIJ' son miles de códigos así pero la diferencia es que los últimos 5 dígitos siempre cambian FGHIJ' pueden ser POR carácter puede llevar letras y números POR combinación pero solo cambian los últimos 5 dígitos el resto siempre es lo mismo inician igual .
2 Respuestas
Intuyo que el editor de la página ha hecho "alguna de las suyas" y te ha cambiado una equis por un "POR" en dos partes del texto. Aún así hay algunos aspectos que necesito que me aclares:
1. Como están separados los códigos dentro del archivo, ¿un código por línea? ¿Varios códigos por línea separados por espacios?
2. El ABC+123+FGHIJ' de los códigos a eliminar, ¿Es literal? Quiero decir, ¿realmente son códigos como ABC+123+4Jp2r', en los que figuran los "+" y la comilla final o los "+" son una forma de hablar y el código real es algo como ABC1234Jp2r'? ¿Y realmente son ABC y 123 o son combinaciones de 3 letras cualquiera y tres números que se repiten en todos los códigos a eliminar pero no forzosamente esos valores? La comilla final, ¿aparece en el código o es una errata?
3. En caso de que en el archivo aparezca alguna línea en blanco ¿se quiere respetar o se puede eliminar? Esto es importante porque si se puede eliminar el código puede ser más sencillo, incluso a veces no hay manera de impedir que se elimine.
4. No estaría mal que copiaras un trozo del archivo con códigos a eliminar y códigos a mantener para evitar malentendidos.
Muchas gracias por haber tomado mi pregunta.. le copio un pequeño ejemplo real de cómo es mi archivo texto. Básicamente lo que necesito es eliminar todos los códigos que inician con LOC+176 seguido de cinco caracteres que son variables y en ocasiones contienen números y la coma al final esa siempre va. es un archivo extenso que pesa como 2mb. Por lo que contiene mucha información..
Si se puede agregar que eliminé todos los espacios en blanco o lineas dentro del archivo también me ayudaría .
LOC+176+ZZCLL' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'LOC+176+ZZCLL' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'
LOC+176+PESAI' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'LOC+176+ZZ3LL' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'LOC+176+Z1CLL' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'
LOC+176+MXCO2' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'LOC+176+ZZCLL' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'
Estoy intentando responderte pero en cuanto escribo las líneas anteriores con las correcciones que interpreto que habría que hacer me dice "Demasiadas mayúsculas en el texto" y no progresa la respuesta. De modo que voy a intentarlo poco a poco.
Si el ejemplo que has puesto es significativo parece que en todas las líneas del archivo existe al menos un código a eliminar y además no siempre está separado por un espacio del código anterior. En tu ejemplo querrías que la primera línea quedara así:
LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476' LOC+9+MXZLO:139:6' LOC+11+USLAX:139:6+:162:5' RFF+BM:1' RFF+BN:80558476'
¿Es correcta mi interpretación?
Vale, ahora parece que ha colado. Al intentar seguir con mi discurso he visto que era la supresión de los espacios en las líneas lo que generaba ese extraño mensaje de "Demasiadas mayúsculas" así que voy a poner un ejemplo que mantenga algunos espacios para que el editor puedar cortar las líneas. Suprimiendo espacios (aunque no todos por lo que acabo de decir) quedaría así:
LOC+9+MXZLO:139:6'LOC+11+USLAX:139:6+:162:5'RFF+BM:1' RFF+BN:80558476'LOC+9+MXZLO:139:6'LOC+11+USLAX:139:6+:162:5' RFF+BM:1'RFF+BN:80558476'
¿Vamos bien?
Creo que ya tengo algo. Prueba con esto:
@echo off Setlocal EnableDelayedExpansion if exist kkk.txt del kkk.txt for /f "tokens=* delims=" %%a in (viridiana.txt) do call :tratlin "%%a" goto :eof :tratlin set cadNoRev=%~1 set cadNoRev=%cadNoRev: =% set /a numCar=1 set cad=%cadNoRev% :cuentacar set cad=%cad:~1% if defined cad set /a numCar+=1&goto:cuentacar set cadRev= set /a pi=0 :bucle set cad=!cadNoRev:~%pi%,8! if "%cad%"=="LOC+176+" (set /a pi+=14 ) else set cadRev=%cadRev%!cadNoRev:~%pi%,1!&set /a pi+=1 if %pi% LSS %numCar% goto :bucle echo %cadRev%>>kkk.txt goto :eof
Donde pone "viridiana.txt" pon el nombre del archivo que quieres "limpiar". El resultado lo deja en kkk.txt. Como el archivo es grande puede que tarde mucho. Te sugiero que antes de meterte con el archivo total te fabriques una versión más pequeña para probar y comprobar si funciona a tu gusto, al menos con archivos pequeños.
Buenas tardes.
Cometí un error y el ejemplo que le envié era de una de mis pruebas fallidas.
el ejemplo real inicia con LOC+76 Y no con LOC+176.. pude hacer que funcionara así modificando el código que me envió mas sin embargo cada cierta lineas me aparce echo desactivado lo cual no debe de aparecer. y si borra bien LOC+76+ seguido de las cinco variables y la coma.
Lo que busco es minimizar tiempos y cuando lo ejecute me demoro 100 segundos para un archivo de 80kb..
explico como lo hago manualmente ...talvez desde esta perspectiva podamos encontrar una solución.
el archivo texto lo abro con el programa microsoft word
y una vez adentro solo lo que hago es buscar palabra y remplazar con cntrl + L
este codigo me busca todo adentro del archivo que empiece con LOC+76
loc+76^?^?^?^?^?^?' y me los borra todos correctamente en 1segundo
y con estos 2 me busca las lineas en blanco y espacios y los elimina
^w
^p
lo malo es que lo hago manual y esperaba encontrar la forma de hacerlo con un bat
le estaría muy agradecido si me pudiera apoyar a encontrar la manera, muchas gracias
Se me ocurre que desde el bat llamar a word buscar palabra y remplazar por nada así borraría todos y después guardarlo ..así lo haría inmediato.. no sé si eso sea posible
Respecto a la aparición del mensaje "Echo está desactivado" imagino que es porque no corregiste todas las consecuencias de cambiar el texto a buscar y borrar por uno un carácter más corto. En concreto habría que cambiar:
set cad=!cadNoRev:~%pi%,8! if "%cad%"=="LOC+176+" (set /a pi+=14
por:
set cad=!cadNoRev:~%pi%,7! if "%cad%"=="LOC+76+" (set /a pi+=13
En cuanto a la comparativa de tiempos tienes que tener en cuenta que desde Word solo comparas la sustitución en memoria, sin incluir el grabado del archivo corregido, cosa que sí que se incluye en los tiempos del bat.
Y no se me ocurre nada mejor en BAT. Si no estoy equivocado la única posibilidad de borrar texto en una cadena es algo así como:
set cadRev=%cadRev:LOC+76+=%
Que borraría todas las apariciones de "LOC+76+" en la cadena cadRev. Pero no creo que haya manera de incluir los cinco o seis caracteres siguientes sean cuales sean.
Tal vez en Visual Basic sobre Word. O en PowerShell, pero en esos terrenos soy un novato y no me atrevo a ofrecerte nada.
Buenas noches.
Hice el cambio tal cual y aun me sigue apareciendo la leyenda "ECHO est desactivado."
@echo off
Setlocal EnableDelayedExpansion
if exist kkk.txt del kkk.txt
for /f "tokens=* delims=" %%a in (viridiana.txt) do call :tratlin "%%a"
goto :eof
:tratlin
set cadNoRev=%~1
set cadNoRev=%cadNoRev: =%
set /a numCar=1
set cad=%cadNoRev%
:cuentacar
set cad=%cad:~1%
if defined cad set /a numCar+=1&goto:cuentacar
set cadRev=
set /a pi=0
:bucle
set cad=!cadNoRev:~%pi%,7!
if "%cad%"=="LOC+76+" (set /a pi+=13
) else set cadRev=%cadRev%!cadNoRev:~%pi%,1!&set /a pi+=1
if %pi% LSS %numCar% goto :bucle
echo %cadRev%>>kkk.txt
goto :eof
buscando este foro.
vi que alguien tenia mismo problema y lo soluciono con esto
se puede adecuar ??
/////////////////////////////////////////////////////////////////
esta
Echo ! ANT!>>temp.txt
Por esta otra:
if not "!ANT: =!"=="" echo !ANT!>>temp.txt
/////////////////////////////////////////////////////////////////
¿Has leído la respuesta de Manuel Alvarez Perez? Si cada código figura en una línea separada (yo entendí que no era así pero tal como me ha hecho ver él en tu pantallazo se ve otra cosa) resolvería tu problema o, al menos, la parte principal de él.
En cuanto a que siga apareciendo "ECHO está desactivado" ya no le encuentro explicación (ese mensaje sale cuando se hace ECHO de una variable vacía). Si quieres pásame el archivo en el que te sale y lo miro.
Por último tendrías que darme alguna pista más para ver si la adecuación que propones puede ser válida (entiendo que solo para eliminar los espacios). Dame el enlace al hilo en el que salía (lo del ANT me suena a mío).
Tendrías que usar un "disco en la nube" tipo Google Drive o Mega. Si no sabes cómo te puedo pasar un enlace con mi dirección, pero sería a través de un archivo disponible solo un rato para evitar que llegue a otros cazadores de direcciones.
No me gustaría dejar esto a medias, al menos en la parte en la que creo que puedo ayudar (es decir, en la de conseguir eliminar el mensaje "ECHO está desactivado"). Como te decía te puedo facilitar mi dirección de correo si quieres mandarme el archivo directamente, pero lo haría a través de un enlace, operativo durante poco tiempo, para impedir que accedan a esa dirección robots u otras personas. Las otras opciones son las típicas de "discos en red" como también te decía.
- Compartir respuesta
Con una sola línea de comando se puede hacer y es rapidísimo, lo único es que tiene que estar estructurado por líneas el Texto, que quiero decir, pues que cada línea tendrá varios datos y una de ellas con tendrá el código a eliminar Ejemplo:
Línea 1 LOC-176-QQQQ descripción
Línea 2 LOC-111-ASDFF DESCRICIÓN
Línea 3 LOC-222-ASD11 descripción
Estas líneas estarían en tufichero.txt
El siguiente comando bat
FIND /V "LOC-1nuevo76" < tufichero.txt > nuevo.txt
Tu fichero nuevo.txt tendrá solamente las líneas 2 y 3.
Esto es rapidísimo, y lo puedes implementar en un fichero bat.
- Compartir respuesta
Pero me da la impresión de que esto no es de fácil aplicación al problema de Viridiana. Si no la he entendido mal la cadena que "delimita" el texto a borrar (que es esa misma cadena más los seis caracteres que la siguen) puede estar en cualquier posición dentro de cualquiera de las líneas del archivo a tratar. - gggirald
Por lo que he visto hay un pantallazo donde está estructurado por líneas, así no tiene que complicarse nada. - Manuel Alvarez Perez
Creo que la estructura en líneas la pone la página. Si copias y pegas verás que solo son tres líneas. Además no quiere borrar toda la línea, solo una parte de ella. - gggirald
Perdón. Tienes razón. En el pantallazo parece que son líneas. En todo caso tendría que ser ella la que contestara. - gggirald