Reemplazar caracteres de líneas especificas en archivo .txt

Tengo un archivo de Texto en el que deseo modificar el numero de empleado que se encuentra a partir de la línea 6 y cada 22 líneas los primeros 6 caracteres, he leído ya acerca de reemplazar caracteres pero no se como hacer para que la línea específicamente sea a partir de la 6 y después cada 22 líneas

1 respuesta

Respuesta
1

Necesito saber en primer lugar si entre las 22 líneas que separan cada línea en la que figura el número de empleado puede o no haber líneas en blanco. En segundo lugar si el número de empleado comparte línea con otra información y si es así si está separado de esa otra información por espacios, tabuladores o algún otro carácter.

Ahora tengo que irme pero si me das esa información espero poder decirte algo mañana por la mañana.

Muchísimas gracias por contestar, realmente me siento afortunada! Estoy tratando por todos los medios de resolverlo, ya ando cerca pues les urge, pero me caerá excelente su ayuda!

Efectivamente existen líneas en blanco y también comparte información el numero de empleado en la línea, así que solo deseo reemplazar el numero de empleado que se encuentra de cada fila de la posición 2 a la 6 por una cadena de caracteres.

Agradezco muchísimo su respuesta!

Saludos!

He vuelto un poco antes de lo que pensaba, pero no sé si ahora será buena hora para ti. No me has dicho si el número de empleado, que comparte línea con otra información, está separado de esa otra información por algún carácter fijo (espacio, tabulador, "/", "_", etc.) o si hay que tomar toda la línea y partirla por posiciones.

Gracias!, 

De hecho es el reporte de un recibo  que no contiene separadores ni caracteres especiales, este numero es de 5 posiciones empezando en la posicion 2 de la linea especificada, no puedo mover nada mas así que solo tengo que sustituir el numero por la palabra "CONT", todo lo demás se debe quedar en su posición original

Pero CONT solo tiene cuatro caracteres. ¿Se deja un espacio?

Mientras me contestas he ido haciendo pruebas y creo que este BAT podría cubrir tus necesidades:

@Echo Off
Setlocal EnableDelayedExpansion
Echo.> temp.txt
del kkk.txt
set nlin=1
for /f "skip=3 tokens=1*" %%i in ('fc /n temp.txt "erica1.txt" ^| findstr -v "*****"') do (
if "%%j" == "" echo.>>kkk.txt
if not "%%j" == "" (
set linea=%%j
if "!nlin!" == "6" (
set linea=!linea:~0,1!CONT !linea:~6!
)
echo !linea!>>kkk.txt
)
set /a nlin=!nlin!+1
if "!nlin!" == "28" set nlin=6
)
rem copy /y kkk.txt erica1.txt

He supuesto que el archivo a tratar es erica1.txt (ahí tendrías que poner el nombre del archivo real).

Para que las pruebas no alteren el archivo original se va copiando, línea a línea, sobre un archivo temporal kkk.txt.

He supuesto que la sustitución es por "CONT " (con un espacio al final). Si fuera otra cadena basta con colocarla donde aparece esta.

Si no te funcionara deberías facilitarme un ejemplo real (o similar a uno real). Lo puedes subir a dropbox o algún servidor de archivos y facilitarme el enlace. Cuando ya lo haya descargado te aviso para que lo borres.

Probare y le enviare el resultado!!!

Mil Gracias!!

Ya lo he ejecutado, solo que en todas las lineas se recorrió la información al inicio de la linea, debo dejar todo igual solo cambiar las lineas indicadas, qué debo cambiar??

Ademas solo me lo hizo hasta la linea 101 y los archivos tienen mas de 20,000 lineas, 

Efectivamente, el comando "fc" (file compare), que necesito utilizar para controlar las líneas en blanco (me costó mucho en el pasado encontrar una solución precisamente para respetar las líneas en blanco de los ficheros tratados), tiene, por defecto por lo que he podido ver al investigar lo que me decías de las 101 líneas, un máximo de 100 líneas consecutivas de diferencias. Pero se puede configurar para otros valores. Sustituye la línea del FOR por esta otra:

for /f "skip=2 tokens=1*" %%i in ('fc /LB100000 /n temp.txt "erica1.txt" ^| findstr -v "*****"') do (

Fíjate que también se ha cambiado el valor del parámetro skip (de 3 a 2).

Lo que no entiendo es lo que quieres decir con "en todas las lineas se recorrió la información al inicio de la linea". ¿Quieres decir que modifica todas las líneas del archivo y no solo las línea 6, 28, 50, 72, ...? En las pruebas que yo hago no es así. Si fuera esto lo que me quieres decir habría que explorar si el fin de línea de ese archivo es el que se espera. Supongo que sabes que para MSDOS el fin de línea lo forman los dos caracteres 0x0d y 0x0a (retorno de carro y cambio de línea en hexadecimal) mientras que en otros sistemas operativos (particularmente Linux/UNIX el final de línea es solamente el carácter 0x0a.

Aclárame este punto.

Hola!!

Gracias GGG, ya se resolvio lo de las lineas, pero  lo de que se modifican las otras lineas no, al final de cada linea no veo nada de caracteres, lo unico que tengo de referencia es que cada linea termina exactamente en la columna 98, no se si eso ayude.

Saludos!!!

Entiendo, entonces, que en todas las líneas se cambian los caracteres del 2 al 5, ambos incluidos, por el valor CONT.

Copia aquí el BAT tal como lo has creado, y no estaría de más que me facilitaras el acceso a un trozo del archivo, suficiente para que tenga tres ocurrencias del número de empleado (es decir más de 50 "líneas"). Puedes retocar lo que te parezca que no debe verse (rellenándolo con X por ejemplo) pero asegurándote antes de facilitármelo que en ese trozo de archivo tampoco funciona correctamente. Espero que sepas hacer lo que te pido. Realmente creo que el Notepad no puede cargar un archivo tan grande pero hay programitas (por ejemplo el HACHA.EXE) que pueden trocear un archivo grande. Si hace falta te lo puedo facilitar.

Ya me dirás.

una cosa mas... el nombre del archivo a modificar puede ser variable???? ya que cambia cada semana.

Tendrás algún correo electrónico a donde pueda enviártelo, es un archivo pequeño el que enviaria

Veo que has valorado la respuesta, pero entiendo que todavía no está cerrada porque sigue pendiente el problema de la sustitución.

En cuanto al nombre del archivo podría ser un parámetro a pasarle al BAT. Si donde decía "erica1.txt" lo cambias por %1 (en este caso no se necesitan comillas) y al ejecutar el bat después del nombre del BAT pones el nombre del archivo a tratar trabajará sobre ese archivo. En ese caso tal vez fuera bueno añadirle algo de código para controlar que se le ha pasado el nombre de un archivo y que ese archivo existe. Algo como:

@echo off
Setlocal EnableDelayedExpansion
if "%1" == "" goto :ayuda
if not exist %1 echo El archivo %1 no existe&goto :fin
echo.> temp.txt
del kkk.txt
set nlin=1
for /f "skip=2 tokens=1*" %%i in ('fc /LB100000 /n temp.txt %1 ^| findstr -v "*****"') do (
if "%%j" == "" echo.>>kkk.txt
if not "%%j" == "" (
set linea=%%j
if "!nlin!" == "6" (
set linea=!linea:~0,1!CONT !linea:~6!
)
echo !linea!>>kkk.txt
)
set /a nlin=!nlin!+1
if "!nlin!" == "28" set nlin=6
)
rem copy /y kkk.txt erica1.txt
goto :fin
:Ayuda
Echo Reemplaza el nombre del empleado por CONT en todo el contenido de un archivo
echo Formato: %0 archivo
echo Ejemplo:
Echo %0 erica1.txt
:Fin

Es imprudente dejar aquí una dirección de correo electrónico. Si no te importa correr ese riesgo deja aquí la tuya y yo te mando la mía a ti personalmente, pero aquí no voy a ponerla. Creo que la página no maneja los "privados" que es la forma en que se resuelve este problema en otros foros similares.

Disculpa que te haya molestado, he editado ya el archivo, solo que no se como enviártelo

y como vi en tu perfil que eres una persona muy experimentada creí tenias alguna dirección publica que utilizaras

y lo de la valoración lo hice por error!!!

Te aseguro que no me has molestado lo más mínimo. Y espero que tampoco yo te haya molestado a ti. Solo te comentaba algo que a lo mejor no se te había ocurrido pero que es muy natural en este tipo de páginas. Si a ti no te importa que figure aquí tu dirección yo no tengo problema en ponerme en contacto contigo y, de esa forma, podrás tener mi dirección. Lo que quiero decir es que no tengo ningún problema en compartirla con nadie para algo concreto pero si la escribo aquí la puede ver todo el mundo, tenga o no interés en que yo les ayude en algo. He intercambiado correspondencia directa con bastante gente, en esta página y en otras, pero de esa otra manera.

La forma neutra de compartir archivos (que no precisa conocer la dirección de correo) es el uso de páginas especializadas como Dropbox, Onedrive, etc.

Pon, si quieres, tu dirección y te mando un correo directo.

Aunque fuera por error.

Si te parece podemos hacer una cosa. He subido a OneDrive un archivito de texto que contiene mi dirección. Si estás de acuerdo te pongo aquí el enlace, te lo descargas y me avisas para que lo elimine. De esta manera es poco probable que se lo lleve nadie más y se elimina el problema. Espero tu conformidad para poner aquí el enlace, pero una vez puesto si no me avisas en 10 minutos lo elimino. ¿Te parece bien?

te paso mi email: [email protected]

Finalmente entramos en contacto directo y aclaramos los aspectos en que no funcionaba mi solución. No creo que interese demasiado pero resumiré diciendo que el uso del comando FC (file compare) que incluí porque era la única forma que conocía de respetar las líneas en blanco hacía que en la variable %%j (que debía recoger toda la línea del archivo) se limpiaran los espacios en blanco anteriores al primer carácter no blanco, y eso en todas las líneas.

Encontré una forma, creo que más sencilla, de respetar las líneas en blanco sin tener que recurrir al FC. La solución adoptada fue la siguiente:

@echo off
Setlocal EnableDelayedExpansion
del kkk.txt
set nlin=1
for /f "tokens=* delims=" %%i in (erica.txt) do (
set linea=%%i
set control=!linea: =!
if "!control!" == "" echo.>>kkk.txt
if not "!control!" == "" (
if "!nlin!" == "6" set linea=!linea:~0,1! CONT!linea:~6!
echo !linea!>>kkk.txt
)
set /a nlin=!nlin!+1
if "!nlin!" == "28" set nlin=6
)
)

Erica ya lo probó y comprobó que funciona como necesitaba. De todas formas hemos quedado en que dará su opinión en esta página.

Efectivamente lo he probado y ya está en funcionamiento perfectamente, muchísimas Gracias GGG por el tiempo a esta solución!!!!

Una vez mas...

¡Gracias! 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas