Modificar fichero que contiene dos líneas con 4 números de serie separados por coma, en una sola con los 8 números

Tengo un archivo que se genera automáticamente después de lectura de Datamatrix llamado BARCODE.DAT que contiene lo siguiente:

Serial1, serial2, serial3, serial4

Serial5, serial6, serial7, serial8

Necesito modificarlo para que aparezca:

Serial1, serial2, serial3, serial4, serial5, serial6, serial7, serial8

Imagino un fichero .bat que tendría que estar corriendo en background para que cada vez que se genera el archivo BARCODE.DAT en carpeta destinada, se me copie arreglado en otra carpeta

1 respuesta

Respuesta

Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba\aaaaa
set archivo=ismavil.dat
set linea=
pushd %carpeta%
del /q tmp.txt
for /f "usebackq tokens=*" %%i in (%archivo%) do if "!linea!"=="" (set linea=%%i) else set linea=!linea!, %%i
Echo ! Linea!>tmp.txt
Popd

Rellena las variables con los valores que te convengan. En principio el archivo unificado quedaría en eTMP.TXT pero puedes añadir un COPY o reescribir directamente el archivo. En cuanto a la ejecución del BAT podría hacerse como tarea programada, por ejemplo. Comprueba que funciona y luego, si acaso, hablamos de como y cuando ejecutarlo

He visto que, una vez más, el editor de la página ha cambiado la "literalidad" del texto. En la penúltima línea del BAT no debe haber espacio entre el carácter "!" y la "L" que sigue, que era minúscula, pero eso no afecta.

Mientras espero respuesta he ido pensando en como se podría hacer para lanzar el BAT en el momento adecuado. Estas son algunas posibilidades:

  1. El BAT puede borrar/renombrar el archivo BARCODE.DAT, de modo que si al lanzar el BAT nuevamente existe ese archivo significaría que se ha generado de nuevo. El renombrado podría incluir fecha/hora. Este método permitiría que el BAT se ejecutase como tarea programada, digamos cada hora.
  2. El BAT puede lanzarse a una hora fija, mediante tarea programada, si se conoce una estimación del instante en que se genera el BARCODE.DAT

Acabo de ver que la consulta es de hace 4 días. Eso podría explicar que todavía no hayas tenido noticia de que ha habido respuesta o, incluso, que hayas desistido. Lo cierto es que la página falla un poco a la hora de enviar un email a los "expertos" que podrían echar una mano y a mí no me había llegado nada.

Parece que esta será una más de las preguntas respondidas sin que el que la generó haya dado ninguna opinión sobre la propuesta que se le ha ofrecido. Así son estas cosas.

Buenas tardes, me acaba de llegar el aviso del último comentario. No me habían llegado antes. 

Voy a revisar los comentarios y te contesto.

Gracias por la ayuda. 

Me alegro mucho. Me da mucha pena cuando se queda una pregunta colgada sin que sepa si ha servido para algo.

lo acabo de probar y funciona excepto que añade un espacio entre MODULO4 y MODULO5

MODULO1,MODULO2,MODULO3,MODULO4, MODULO5,MODULO6,MODULO7,MODULO8

Respecto a lo de ejecutarlo, debería estar continuamente escuchando.

El archivo original lo he de borrar después de generar el tmp.txt para que cuando se vuelva a generar uno nuevo se aplique directamente.

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba\aaaaa
set archivo=ismavil.dat
set linea=
pushd %carpeta%
del /q tmp.txt
for /f "usebackq tokens=*" %%i in (%archivo%) do if "!linea!"=="" (set linea=%%i) else set linea=!linea!, %%i
Echo ! Linea!>tmp.txt
del /q ismavil.dat
Popd

El otro archivo generado se lo lleva otra aplicación que lo usa.

Bien, vamos a ver si conseguimos que funcione de forma razonable.

En primer lugar el espacio extra generado es consecuencia de una interpretación demasiado al pie de la letra de tu planteamiento original. Puedes ver que en tus ejemplos había espacios tras las comas. Bastaría quitar el espacio que hay en la línea del FOR. Quedaría:

for /f "usebackq tokens=*" %%i in (%archivo%) do if "!linea!"=="" (set linea=%%i) else set linea=!linea!,%%i

Creo que no entiendo del todo un par de cosas:

1. El archivo original lo he de borrar después de generar el tmp.txt para que cuando se vuelva a generar uno nuevo se aplique directamente.

¿Quieres qué el BAT elimine el %ARCHIVO% antes de terminar? Por supuesto que eso no sería ningún problema pero no sé como encaja esto con la otra cosa,

2. El otro archivo generado se lo lleva otra aplicación que lo usa.

Por último, respecto a las dos posibilidades que te ofrecía por ahí arriba (numeradas como 1 y 2), ¿puedes decirme algo?

Acabo de darme cuenta de que ya me contestabas a lo del borrado en tu "versión" del BAT. Yo lo haría así, de momento:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba\aaaaa
set archivo=ismavil.dat
set linea=
pushd %carpeta%
del /q tmp.txt
for /f "usebackq tokens=*" %%i in (%archivo%) do if "!linea!"=="" (set linea=%%i) else set linea=!linea!,%%i
echo !linea!>tmp.txt
del /q %archivo%
Popd

Ya sabes que el editor de la página incluye por su propia cuenta un espacio entre "!" y "linea" en la antepenúltima línea, además de empezarla por mayúscula.

OK, disculpa si me explique mal al principio, correcto ahora ya no me deja el espacio.

Ha sido de gran ayuda.

Solo me quedaría el que se ejecutara continuamente en background, cada vez que se genera un archivo de estos, no es un tiempo fijo puede variar, así que debería estar corriendo siempre en bucle.

Como se dice actualmente, define continuamente...

Se puede incluir en el BAT que investigue si el archivo objeto de esta actuación existe, si es así que haga el trabajo y si no es así que abandone. Este BAT se podría lanzar desde el programador de tareas cada cierto tiempo (ahí entraría lo del "define continuamente", en especificar ese cierto tiempo).

El BAT podría ser algo así:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba\aaaaa
set archivo=ismavil.dat
set linea=
pushd %carpeta%
if not exist %archivo% goto :EOF
del /q tmp.txt
for /f "usebackq tokens=*" %%i in (%archivo%) do if "!linea!"=="" (set linea=%%i) else set linea=!linea!,%%i
echo !linea!>tmp.txt
del /q %archivo%
Popd

Si no tienes experiencia con el programador de tareas de Windows (supongo que hablamos de Windows 10, pero podría ser XP) puedo echarte una mano.

En mi última intervención di por seguro que el editor de la página iba a crear el maldito espacio de siempre y, no sé por qué, no ocurrió. Pero eso no significa que se haya vuelto respetuoso.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas