Archivo que cambie periódicamente letras por números en los archivos .csv de una carpeta

Tengo este comando (que me ayudaron a hacer previamente en el foro), el mismo permite cambian letras por números en un archivo .csv y genera el cambio en un archivo nuevo llamado generado.txt

@echo off
Title Modificador de estructura de archivo de marcaciones
Setlocal EnableDelayedExpansion
Echo Modificador de estructura de archivo de marcaciones.
Echo Indique el nombre del archivo a modificar.
Set/p archivo=""
set carpeta=D:\batch\
pushd %carpeta%
del /q generado.txt>nul 2>&1
for /f "usebackq delims=" %%x in ("%archivo%") do (
set linea=%%x
set linea=!linea:I=1!
Set linea=!linea:O=2!
Echo ! Linea!>>%archivo%.txt
)
Echo Pulse intro para cerrar.
Popd
Pause>nul

Pero ahora me piden que el cambio de letras por números sea automático y en todos los archivos .csv de la carpeta, mi idea es de hacer un batch que se ejecute periódicamente y que haga ese cambio.

También un cambio que necesitaría hacerle al batch es el de que los nombres de los archivos tienen que ser los mismos, pero con formato cambiado a .txt

1 Respuesta

Respuesta
1

Si te he entendido bien quieres un bat que trate todos los archivos CSV de una carpeta convirtiendo en ellos la letra "I" (i mayúscula) en un "1" y la letra "O" en un "2" dejando el resultado en un archivo con el mismo nombre que el CSV pero con extensión TXT. Si fuera así puedes probar con esto:

@echo off
Title Modificador de estructura de archivo de marcaciones
Setlocal EnableDelayedExpansion
Echo Modificador de estructura de todos los archivos de marcaciones.
set carpeta=D:\Carpeta prueba
pushd %carpeta%
for /f "delims=" %%a in ('dir /b *.csv') do call :tratarch "%%a"
echo Pulse intro para cerrar.
popd
pause>nul
goto :eof
:tratarch
del /q generado.txt>nul 2>&1
for /f "usebackq delims=" %%x in ("%~1") do (
   set linea=%%x
   set linea=!linea:I=1!
   set linea=!linea:O=2!
   Echo ! Linea!>>generado.txt
   )
ren generado.txt "%~n1".txt
goto :eof

Supongo que el editor de la página hará sus "gracias" y pondrá en mayúsculas las primeras letras de algunas líneas y separará en algunos casos el carácter "!" del nombre de la variable, pero como ya has podido comprobarlo otras veces no tendré que corregirlo expresamente después de darle a ENVIAR.

Hola, gracias por responder, pues, al correrlo, sólo me genera un archivo llamado generado, en el que si hace el cambio, pero los demás archivos quedan intactos, sólo cambié la dirección de la carpeta, no creo que eso pueda ser la causa del problema :s

@echo off
Title Modificador de estructura de archivo de marcaciones
Setlocal EnableDelayedExpansion
Echo Modificador de estructura de todos los archivos de marcaciones.
set carpeta=D:\Batch
pushd %carpeta%
for /f "delims=" %%a in ('dir /b *.csv') do call :tratarch "%%a"
echo Pulse intro para cerrar.
popd
pause>nul
goto :eof
:tratarch
del /q generado.txt>nul 2>&1
for /f "usebackq delims=" %%x in ("%~1") do (
   set linea=%%x
   set linea=!linea:I=1!
   set linea=!linea:O=2!
   Echo !Linea!>>generado.txt
   )
ren generado.txt "%~n1%".txt
goto :eof

no sé si aporte, pero veo que en la parte de arriba tienes el cierre así

echo Pulse intro para cerrar.
popd
pause>nul

pero al ejecutar el bat, no me sale esa linea de texto ni se cierra al presionar enter.

Espero puedas ayudarme, de antemano, gracias.

En mis pruebas funciona pero, por lo que me dices, da la impresión de que al tratar algún CSV (tal vez el primero si no aparece ningún archivo TXT convertido correctamente) ocurre algo "imprevisto" que hace que no se complete el FOR de la "rutina" TRATARCH. Si se completara no aparecería ningún archivo GENERADO.TXT puesto que al final se renombra. Esta misma "anomalía" es la que hace que no se complete el BAT y por ello no sale el texto del ECHO. Dices que no se cierra el presionar enter, ¿cómo se queda el BAT? ¿Puedes poner un pantallazo?

Sería interesante ver si no hay ningún archivo convertido correctamente (con extensión TXT y el nombre de algún CSV) y si el GENERADO.TXT, o el archivo del que procede, tienen algún carácter que pueda invalidar el tratamiento hecho en ese segundo FOR

Hola!

Ya vi cuál era el problema, habían archivos en los que no había "I" y eso al parecer generaba una excepción que no permitía que continúe el comando.

Habría la forma de resolver eso?
Pensaba en condicionar la forma en que actuaba el comando, para que haga el cambio de las "I" si hay "I" y si no las hay, pase al comando del cambio de las "O".

No debe ser ese el problema. El que no haya ninguna "I" en el archivo que se está tratando no debe generar ninguna excepción. Si no hay "I" en la línea tratada no se cambia por un "1" y se pasa a lo siguiente. De hecho en mis pruebas hay archivos sin "I" ni "O" y otros que sí las tienen. Insisto en que sería interesante saber que mensajes se producen.

Así es como queda el CMD, sólo queda el título (esto cuando los archivos a tratar no tienen "I")

ahora que reviso, el documento si tiene "I" en el encabezado, lo que me deja con más dudas.

Este es un extracto del documento

N2mbre    sT1me    checktype    Maqu1na
13091xxxx    2020-05-13 05:58:15 000    0    101
13091xxxx    2020-05-13 13:06:56 000    0    101
13091xxxx    2020-05-14 09:15:21 000    0    101
13091xxxx    2020-05-14 19:11:45 000    0    101
092082xxxx    2020-05-16 19:57:36 000    0    101
093017xxxx    2020-05-20 22:02:00 000    0    101
13091xxxx    2020-05-21 06:02:44 000    0    101
091848xxxx    2020-06-01 19:41:32 000    2    101
093008xxxx    2020-06-01 20:10:22 000    2    101
091758xxxx    2020-06-01 20:21:34 000    2    101
091314xxxx    2020-06-01 20:30:27 000    2    101
091734xxxx    2020-06-01 20:38:59 000    2    101
13074xxxx    2020-06-02 06:32:07 000    2    101
094029xxxx    2020-06-02 06:32:35 000    2    101
091734xxxx    2020-06-02 06:41:46 000    2    101

Como podrás ver el bat si modifica bien las letras pero igual, por alguna razón, se genera la excepción 

En realidad eso parece indicar que el bat se queda colgado, pero no puede ser solo porque no tenga ninguna "I". Si tienes localizado algún CSV que provoque esa situación hazle un TYPE para que pueda verlo. O haz una prueba en un entorno de pruebas con un archivo CSV con pocas líneas y sin "I" a ver que pasa. También le puedes poner una "instrucción de depuración" dentro de la rutina TRATARCH (algo como ECHO %1 en la primera línea de la rutina) para ver que es lo que está pasando y con que archivo.

Por cierto, lo anterior es lo que sale en el archivo generado.txt

Me sale eso cuando pongo el comando que me dijiste

Ese es el archivo que se va a tratar cuando se queda "colgado". Habría que ver que línea se está tratando, poniendo, por ejemplo un ECHO ! Linea! Antes del ECHO ! Linea!>>generado.txt

Al poner el Echo !Linea! me funcionó correctamente, corrió todo sin problemas y pues, la verdad, no incomoda mucho, gracias por la ayuda.

¡Que raro! Me gustaría saber la causa, pero si no consigo reproducirlo, y si prefieres dejarlo así, lo dejaremos estar. Pero si quieres que sigamos investigando estaré esperando.

Si quieres, seguimos buscando el problema, si necesitas más información de mi parte, pídela nomás.

Otra pregunta, ¿no hay forma de hacer que el Bat corra sólo y en 2do plano cada cierto tiempo o cada que se añada un .csv a la carpeta?

Sería interesante que yo intentara reproducir el problema, para lo cual podría valer que me pasaras el contenido de un archivo CSV que lo provoque. Si tienes que recortar información o cambiarla lo haces y luego compruebas que sigue ocurriendo el problema (quitando, claro, los ECHOs de depuración). En cuanto tengamos un ejemplo lo más corto posible que produzca el problema estaremos cerca de diagnosticarlo.

Respecto a lanzar automáticamente el bat y que lo haga en segundo plano (es decir, sin emitir mensajes ni abrir ventanas visibles) la solución es el "programador de tareas". Este último aspecto (2º plano) tendría que refrescármelo porque hace mucho que lo usé y no recuerdo bien cómo se hacía. El arranque automático se puede programar a una hora fija, cada cierto tiempo, al encender el ordenador, etc.

En todo caso hay que tener en cuenta que la ejecución repetida automáticamente obliga a resolver el problema de tratar archivos que ya han sigo tratados. Se podría arreglar comprobando, por ejemplo, que el TXT correspondiente al CSV no existe.

Indícame tu mail para enviarte el .csv

Te dejo la dirección en este enlace durante 24 horas:

https://drive.google.com/file/d/1V6ct_P444fqPOQAgRS_98_PSzPs4o4Th/view?usp=sharing

Ya te he autorizado. Pensé que no sería necesario, perdón.

Listo, ya te envié, disculpa la demora, estaba en clases

Recibidos y tratados. Ya seguimos por correo privado. La conclusión la escribiremos por aquí, cuando lleguemos a ella.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas