Cómo cambiar los separadores "," por tabulaciones por medio de un .bat

Tengo una serie de archivos .txt en los que la información está con separadores "," (coma) y quiero cambiarlos por tabulaciones, estos archivos tienen la información en varias filas, además, como suele ser una cantidad alta de archivos, quiero crear un archivo .bat para que haga este cambio de manera automática. ¿Cómo puedo configurar el archivo .bat para hacer eso?

1 Respuesta

Respuesta
1

Prueba con esto:

--------------------------------------------------------------------

@echo off
Setlocal EnableDelayedExpansion
del kkk.txt
if "%1" == "" goto ayuda
for /f "tokens=* delims=" %%i in (%1) do (set c=%%i&echo !c:,= ! >> kkk.txt)
copy /Y kkk.txt %1
goto fin
:Ayuda
Echo Reemplaza comas por tabuladores en todo el contenido de un archivo
Echo Formato: %0 archivo
Echo Ejemplo:
echo %0 kk.txt
:Fin

----------------------------------------------------------------

Salva lo anterior o cópialo al notepad o bloc de notas. Asegúrate de que no existe un archivo con el nombre del archivo auxiliar (kkk.txt) y, sobre todo, que lo que tienes después del igual en "echo !c:,= !" es un tabulador y no un espacio en blanco o algo distinto. Sálvalo con el nombre que te parezca mejor (por ejemplo SUSCOMTB.BAT) y luego ejecútalo incluyendo el nombre del archivo en el que quieres hacer la sustitución.

Ya me contarás si te funcionó. Si quieres preguntar algo sobre el código puedes hacerlo.

Saludos,

GGG

<div id="_dyhb23rg4374"> </div>

Se me olvidó decirte que si el tabulador fue sustituido por un espacio (es lo más probable y lo que me ha pasado a mí al hacer la prueba) debes reponer el tabulador, borrando el espacio y pulsando la tecla de tabulador antes de salvar el BAT.

Suerte,

GGG

Gracias Experto GGGIRALD, funcionó perfectamente. Desde un inicio validé lo del espacio para que fuera una tabulación y ha trabajado de manera correcta. En este caso sólo tengo una duda adicional al proceso; la ejecución y trabajo es por archivo ¿existe la posibilidad de que se pueda programar para que haga el cambio en todos los archivos que contenga la carpeta sin que se tenga que hacer uno a uno.

¡¡Gracias nuevamente por el apoyo!!

Prueba esto:

------------------------------------------------------

@echo off
Setlocal EnableDelayedExpansion
@echo off
for /f %%a in ('dir /b *.*') do (call :camcomtb %%a)
goto :EOF
:camcomtb
del kkk.txt
for /f "tokens=* delims=" %%i in (%1) do (set c=%%i&echo !c:,= ! >> kkk.txt)
copy /Y kkk.txt %1
goto :EOF

-------------------------------------------------------

El BAT no debería estar en la misma carpeta que los archivos que quieres cambiar, porque también intentaría modificarlo, pero debe ejecutarse desde ella. Digamos que le llamamos SUSCOMTB.BAT y que lo guardas en la carpeta C:\BAT y que los archivos que quieres tratar están en C:\TMP. Abres una ventana de MS-DOS (CMD), te sitúas en C:\TMP e invocas al bat con C:\BAT\SUSCOMTB.

Si los archivos a tratar tienen una extensión determinada (digamos TXT podrías cambiar el primer FOR para que el comando DIR solo listara los archivos con esa extensión. En este caso el BAT podría convivir con los archivos porque no estaría incluido.

Cuéntame como te ha ido.

¡Y no olvides revisar que el tabulador sigue siendo un tabulador! (Ahora en la línea del segundo FOR)

Hola Experto, funcionó perfectamente. Lo he usado en conjunto con un xcopy porque mis archivos originales son .csv, con el xcopy los paso a texto y con estas instrucciones les he cambiado los separadores, el proceso lo hace completo y sin problemas, pero al revisar mis archivos veo que las fechas me las modifica en el formato de año, es decir; la fecha en el archivo .csv tiene el formato mm/dd/aaaa y al copiarlo a .txt me lo coloca como mm/dd/yy, tendrás alguna sugerencia para corregir esto?

Gracias nuevamente!

No entiendo bien esto último. ¿Para qué usas el XCOPY? Parece que para pasar archivos CSV a texto, pero los archivos CSV ya son archivos de texto. ¿Es, solo, para cambiarles la extensión (se podría hacer con RENAME o REN)? Pero independientemente de esto, supongo que te refieres a la fecha que acompaña al nombre del archivo cuando sacas un directorio de la carpeta, pero yo no consigo reproducir el problema que comentas. Si ejecuto el comando "XCOPY *.CSV *.TXT" el formato de la fecha de los archivos TXT es idéntico al formato de la fecha de los CSV cuando hago un DIR de la carpeta. De hecho entiendo que el formato de fecha es algo que depende de la ventana de CMD (o de los parámetros regionales del propio PC). ¿Cuál es el texto exacto del comando XCOPY que utilizas? ¿Lo incluyes en el BAT o lo ejecutas previamente?

¿O te refieres a un cambio en fechas internas de los archivos? Es decir que dentro de un archivo antes de la conversión había una fecha como 11/28/2012 y después de la conversión pasa a 11/28/12. Esto no tendría mucho sentido creo, pero...

Gracias por la atención y ayuda Experto GGGIRALD.

Creo que ha sido confuso mi comentario, los archivos .CSV los obtengo directamente del programa que genera la información que utilizo, para que esa info sea leída por una interface debe estar contenida en un archivo .TXT, ese paso lo hago actualmente abriendo el archivo .CSV con Excel y copio la información de manera manual para crear un .TXT, al hacer eso se va la información tal como la necesito (con tabulaciones como separador entre datos), pero esto es demasiado lento cuando tengo que hacerlo para 300 o más archivos. Por eso pensé en copiarlos a .TXT por un bat (tal vez no era la mejor forma de hacerlo). El "XCOPY" que usé para esto es simple:

@echo off

echo Hacer copia de archivos CSV a TXT

pause

xcopy "*.csv" "*.txt"

cd "C:\"

pause

exit

El hacer este proceso es cuando el archivo .TXT tenía los separadores "," y por ello la necesidad de cambiarlos a Tabulaciones.

Respecto a la fecha es como mencionas al último, el archivo contiene información de fechas y horas de varios registros y al ser copiada al .TXT es cuando no lo respeta.

Hice una prueba para, en lugar de copiar, renombre el archivo pero también modifica el formato de las fechas a los registros contenidos en el archivo: 03/05/2013 a 03/05/13.

Tal vez necesito una manera diferente de sacar la información del .CSV a .TXT.

Gracias y saludos!!

Dado que el proceso de cambio de nombre de un archivo no entra, en ningún caso, en el contenido del mismo, creo que la información de fecha contenida en los archivos CSV tiene el formato mm/dd/yy y que la visualización como mm/dd/yyyy es cosa de Excel. Eso puedes verlo directamente sin más que hacer un "TYPE pepito.csv" siendo pepito. Csv uno de los archivos CSV obtenidos mediante el proceso que indicas. Si fuera así para cambiarle el formato tendrías que ver si el proceso de obtención permite elegir la presentación de las fechas. Si no fuera posible y supieras que todos los años que figuran en los archivos son de un tipo, por ejemplo "/13" se podría intentar retocar el BAT para que, además de cambiar las comas por tabuladores cambiara el "/13" por "/2013" (con ciertas precauciones porque si la cadena a cambiar puede aparecer en otro contexto que no sea de fecha podría tener "efectos colaterales").

Ya me contarás por donde seguimos.

Hola GGGIRALD,

Tienes razón respecto a cómo viene la fecha en el archivo .CSV, la fecha está en el formato mm/dd/yy, es Excel el que me muestra la fecha completa. Voy a revisar con el distribuidor de esa aplicación la manera de tener el formato de fecha completo. Espero mañana tener una respuesta y poder compartirte el avance.

Gracias por tu ayuda y saludos!!

Hola GGGRIRALD.

Están por definirme si es posible hacer el cambio en el programa, tal vez en la semana me den una respuesta definitiva.

Mientras eso sucede me gustaría, en caso de ser posible, probar el "retoque" que mencionas para cambiar el valor a 2013, este valor de año será fijo al menos lo que resta del año y en caso de tener que hacer un cambio para el siguiente sería cuestión de moverlo a 2014 en su momento. ¿Cómo se tendría que hacer la configuración en el .BAT para que esto suceda?

Gracias por tu apoyo!!

Pues creo que esto podría valer:

-------------------------------------------------------------------

@echo off
Setlocal EnableDelayedExpansion
@echo off
for /f %%a in ('dir /b *.*') do (call :cambiar %%a)
goto :EOF
:cambiar
del kkk.txt
for /f "tokens=* delims=" %%i in (%1) do (
set c=%%i
set c=!c:,= !
echo !c:/13=/2013! >> kkk.txt
)
copy /Y kkk.txt %1
goto :EOF

--------------------------------------------------------------

Pero no olvides reponer el tabulador en el segundo SET. Y ten en cuenta los posibles "efectos colaterales" si apareciera la cadena "/13" en algún otro punto de alguno de los archivos.

Y utiliza el RENAME mejor que el XCOPY que, como se dice por acá, sería "matar pulgas a cañonazos" porque el primero solo tiene que modificar la inscripción del archivo en el directorio mientras que el segundo tiene que copiar, además, los datos. Salvo que quieras mantener los archivos originales (los CSV), claro.

Ya me contarás.

Hola GGGIRALD.

Hice la prueba hoy y los ha modificado de manera correcta, el proceso resultó en un tiempo bastante bueno y el cambio en las fechas en que el día sea 13 las haré manualmente por el momento.

En el caso de los archivos originales sí me es necesario conservarlos y por ello la copia es más conveniente en el proceso.

Con esto queda resuelto el problema y tal vez en un futuro cercano esté nuevamente solicitando tu ayuda.

Agradezco tu tiempo, el completo apoyo y la total apertura a compartir tus conocimientos.

Saludos.

AGM

Nuevamente agradezco la paciencia y apoyo en este problema.

Es sumamente grato encontrar personas que, de manera desinteresada, brindan ayuda y orientación en estos temas.

Experto GGGIRALD, 100% recomendable y total disposición para ayudar.

Saludos.

AGM

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas