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>nulPero 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
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 :eofSupongo 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 :eofno 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.
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.
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.
Te dejo la dirección en este enlace durante 24 horas:
https://drive.google.com/file/d/1V6ct_P444fqPOQAgRS_98_PSzPs4o4Th/view?usp=sharing
Recibidos y tratados. Ya seguimos por correo privado. La conclusión la escribiremos por aquí, cuando lleguemos a ella.
Revisando este mensaje he visto que al final no dijimos nada sobre la conclusión. Después de más de un año no la recordaba pero consultando la correspondencia he visto que al final el problema parecía ser del equipo en el que se estaba probando. Al cambiar a otro equipo no se daba el último problema.
- Compartir respuesta

