BAT para eliminar espacios en blanco y reemplazar carácter en campos numéricos

En mi nuevo empleo, me eh topado con un problema en la administración de datos. Sucede que los archivos productos del proceso del sistema de facturación contienen en su mayoría una coma (,) como separador decimal en vez del punto (.), además encuentro que dentro de los campos numéricos hay espacios en blanco como separador de miles. Mi necesidad es crear un BAT que pueda eliminar los espacios en blanco y reemplazar las comas (,) por punto (.) Solo en los campos numéricos, sin afectar las demás columnas (dado que pueden contener datos como nombres de clientes o direcciones).

El archivo es un .TXT cuyo separador de columnas es TAB. Aquí adjunto unas cuantas filas de uno de los archivos que contiene este escenario, cabe señalar que los diferentes archivos tienen una estructura distinta, por lo que no sé si sea posible tener una solución en la cual se aplique solo a campos numéricos.

Nota: Por la cantidad de campos se ve terriblemente mal, pero es en el campo #40 donde se ve el separador de miles en blanco y en los otros campos numéricos se ve a la coma (,) como separador decimal.

_______________________________________________________________________________________________

Suministro Sucursal Sec.Tipico Cant.Sum en Acom. Caract.Med Tipo Med Pot_Conect (Kw) Pot_Contrat. (Kw) Tarifa Clave Tarifa Tarifa Mant. Rep. Categoria Cliente VIP Hilos Medidor Acometida Tension Posicion Califica Clave Fact. Fecha lect. Ant Fecha lect. Act Periodo Fact. Factor Fose P.U. Activa FP P.U. Activa HP P.U. Reac. Ind. P.U. Reac. Cap. P.U. Dda. Dist.FP P.U. Dda. Dist.HP P.U. Dda. Gener. P.U. Ley Nro.28749 P.U. Energia Case P.U. Energia HP Case P.U. Dda. Gener. Case P.U. Dda.FP Case P.U. Dda.HP Case P.U. Fijo Regul.Maximo P.U. Energia Regul.Maximo P.U. Fijo Energia Regul. Maximo Ene. Act.FP(Kwh) Ene. Act.HP(Kwh) Ene. React. Ind. Ene. React. Cap. Dem.Fact.FP(Kw) Dem.Fact.HP(Kw) Dda. Generacion(Kw) Cons. Ley Nro.28749 (Kwh) Mant.Medidor (S/.) Reposicion Medidor (S/.) CRER (S/.) Mant. Repos.CRER (S/.) Cargo Fijo (S/.) Alumbrado Publico (S/.) Energia FP (S/.) Energia HP (S/.) En.Rea.Ind.(S/.) En.Rea.Cap.(S/.) Dda.Fp (S/.) Dda.Hp (S/.) Dda.Generacion (S/.) Cargo Fijo Energia (S/.) Comp.Ley Nro.28749 (S/.) Energia Case(S/.) Energia HP Case(S/.) Dda. Gener. Case(S/.) Dda.FP Case(S/.) Cargo Fijo Energia Case(S/.) Cargo Fijo Regul. Maximo(S/.) Energia Regul. Maximo(S/.) Cargo Fijo Energia Regul. Maximo(S/.) Dif.Cargo Fijo MCTER(S/.) Dif.Energia MCTER(S/.) Dif. Cargo Fijo Energia MCTER(S/.) Total Actual(S/.) Total Anterior (S/.) Variacion Valor Fose 100 Valor Fose 101 Valor Fose 102 Fose Cargo Fijo Fose Energ. Act FP Fose Energ. Act HP Fose Demanda Fp Fose Demanda Hp Fose Demanda Generacion Fose Carg Fijo Energ Fose Energ. Rea. Ind. Fose Energ. Rea. Cap. Fose Energ.Act FP Case Fose Energ.Act HP Case Fose Demanda Gen. FP Case Fose Demanda Fp Case Fose Carg Fijo Energ Case Caja Medicion
1613629 3300 1 2 A T 20,00 N BT5CA 0012 BT5B 6 N 3 S 0 432 N N 26/01/2022 24/02/2022 29 1,04713793 0,6646 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0092 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 9 765,60 0,00 0,00 0,00 0,00 0,00 0,00 9 765,60 1,26 0,64 0,01 1,91 3,36 160,20 6 490,22 0,00 0,00 0,00 0,00 0,00 0,00 0,00 89,84 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 6 745,53 7 066,75 -0,05 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 M
1254971 4300 1 1 A T 2,12 N BT5CA 0012 BT5B 6 N 3 A 0 348 N N 26/01/2022 24/02/2022 29 1,33330000 0,6646 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0092 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 9 896,00 0,00 0,00 0,00 0,00 0,00 0,00 9 896,00 1,33 0,52 0,01 1,86 3,36 160,20 6 576,88 0,00 0,00 0,00 0,00 0,00 0,00 0,00 91,04 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 6 833,34 6 269,02 0,09 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 M
1352672 5100 1 1 A M 8,94 N BT5CA 0012 BT5B 6 N 3 A 0 492 N N 26/01/2022 24/02/2022 29 1,33330000 0,6646 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0092 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 9 840,00 0,00 0,00 0,00 0,00 0,00 0,00 9 840,00 1,30 0,23 0,01 1,54 3,36 160,20 6 539,66 0,00 0,00 0,00 0,00 0,00 0,00 0,00 90,53 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 6 795,29 6 967,79 -0,02 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 M

_________________________________________________________________________________________

Gracias por cualquier ayuda que me puedan proporcionar, pienso que el escenario que planteo es retador y a pesar que eh buscado en este mismo foro temas similares (y que me han logrado ayudar parcialmente) no doy con una solución mas integral.

1 Respuesta

Respuesta
1

Hay algo que no me queda claro respecto a los espacios como separadores de miles. Veo en el ejemplo cosas como (lo pongo en una ventanita snippet, icono <> de la barra de tareas, para separarlo del texto):

1613629 3300 1 2 A T 20,00 N BT5CA 0012 BT5B 6 N 3 S 0 432 N N 26/01/2022 

El espacio entre 1613629 y el 3300, ¿es uno de esos espacios que hay que suprimir? Me parece a mí que no, porque los 3300 suenan a potencia contratada y lo otro podría ser la lectura de contador. Pero, si es así, ¿cómo se distinguen esos espacios separadores de miles de estos?

Buen día y gracias por tomarte el tiempo GGGIRALD. Respondiendo a tu pregunta, el espacio en blanco que ves entre 1613629 y 3300 es en realidad un TAB, son campos diferentes; de hecho, los problemas de espacios en blanco dentro de los campos numéricos aparecen a partir de la columna #40 (para este reporte) cuyo campo es Ene.Act.FP(Kwh). 

Entonces necesitaría un archivo de ejemplo con tabuladores reales en los casos en que proceda (no sustituidos por espacios).

Para empezar a hablar de algo concreto, si pongo en el parámetro DELIMS del FOR que trate las líneas de este archivo el valor correspondiente al tabulador, ¿puedo suponer que si el primer carácter de uno de los campos es numérico es razonable sustituir, en ese campo, cualquier espacio por nada y cualquier coma por un punto?

No tengo muy claro todavía como podría contemplar todos los campos (me salen del orden 93). Lo suyo sería hacerlo con SHIFT para no tener que saber cuál es el número de campos, pero no se me ocurre, de momento, como conjugar esa instrucción con los tabuladores como separadores.

¿Has pensado en sustituir los tabuladores por ";" y tratar el archivo como un CSV para manejarlo con Excel posteriormente? A lo mejor así es más sencillo.

Sería bueno poderte enviar el archivo para que lo puedas revisar con exactitud. No se si podrías indicarme algún mail a donde pueda adjuntártelo (si no es indiscreción).

Respondiendo a tu pregunta "¿puedo suponer que si el primer carácter de uno de los campos es numérico es razonable sustituir, en ese campo, cualquier espacio por nada y cualquier coma por un punto?. Si, esa suposición podría aplicarse perfectamente.

Sobre reemplazar los tabuladores por ";" para usarlo en Excel, pienso que no sería factible; dado que en el archivo existen números de hasta 8 decimales y el Excel por default los puede redondear al separarlos en columnas.

En este enlace está mi dirección de correo:

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

Mantendré el acceso durante 1 hora. Si lo ves antes avísame y lo cortaré.

Listo, te lo envío en un par de minutos, gracias!!

Muy bien. Ya he cortado el acceso

Espero te haya llegado mi mail, quedo atento a cualquier comentario, gracias!!

Pues no, no me ha llegado ningún email.

Estaba en spam, ya lo he recuperado. Te diré algo cuando tenga algo que decirte.

Como ya te he dicho directamente, lo primero que he hecho es probar la opción que te sugería de cambiar tabuladores por ";" y tratar el archivo resultante como CSV. Te adjuntaba el resultado pero me temo que no has debido recibirlo porque no me has contestado.

Otra cosa que se me ha ocurrido es que, si los archivos que tienes que tratar tienen la misma estructura que el que me has pasado, la única línea que hay que tratar de forma especial es la primera, que contiene los encabezados de las columnas y, digamos, sería tipo "texto". Las siguientes líneas pueden recibir todas el mismo tratamiento que sería cambiar "," por "." y eliminar los espacios. Te copio aquí un BAT que haría eso:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\carpeta prueba
set archivo=calimp0000.18_847570
pushd %carpeta%
del /q kkk.txt
set /a nl=1
for /f "usebackq tokens=*" %%a in ("%archivo%") do (
   set linea=%%a
   if !nl!==1 (echo !linea!>>kkk.txt
      ) else (set linea=!linea:,=.!&set linea=!linea: =!&echo !linea!>>kkk.txt)
   set /a nl+=1
   )
Popd

Pon en la variable CARPETA el path de la carpeta que contiene el archivo y en la variable ARCHIVO el nombre del archivo a tratar. El archivo tratado quedaría en KKK.TXT.

Ya me contarás si te vale.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas