Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

depurar campos.

Estas en el tema de depurar campos. en el foro de Mysql en Foros del Web. hola.. tengo un campo de texto donde guardo cedulas. son mas o menos 5mil cedulas. lo malo es que los han metido de una forma ...
  #1 (permalink)  
Antiguo 12/09/2009, 09:44
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
depurar campos.

hola..

tengo un campo de texto donde guardo cedulas.
son mas o menos 5mil cedulas.
lo malo es que los han metido de una forma incorrecta hay numeros y letras combinadas, hay espacios, hay campos vacios, etc..

quiero hacer varias cosas para depurarla un poco y dejarla de la forma correcta

quiero primero reemplazar cualquier caracter diferente a numero por nada.
es decir letras, simbolos, espacios, quitarlos para que queden solo numeros

quiero que las cedulas que sean menores a 6 digitos, reemplazarlos por 0

los campos vacios y/o nulos reemplazarlos por 0

y por ultimo cambiare el tipo de campo de varchar a bigint. para ke de aqui en adelante solo sean numeros..

mi pregunta es..
existe alguna forma por medio de consultas hacer varios replace o como podria depurarla para ir dejandola como quiero ke kede..

gracias.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #2 (permalink)  
Antiguo 12/09/2009, 10:14
 
Fecha de Ingreso: abril-2009
Ubicación: Miami
Mensajes: 182
Antigüedad: 14 años, 11 meses
Puntos: 8
Sonrisa Respuesta: depurar campos.

hola lexus .. dale un vistazo a este:

<?php
while ($row){//$row es tu recordset que recorre todos los campos de tu tabla
$id = $row['id'];//capturo el id de la cédula que estoy chequeando
$check = $row['campo_cedula'];//capturo la cadena que hay en ese campo de cédula

$array=str_split($check);// Convertir la cadena en un array.

//recorres tu array
for( $i = 1; $i < count($array); $i ++){//con count cuentas el largo de tu array
if ((is_numeric($array[$i]))==FALSE){//si el valor NO es numerico
unset($array[$i]); // elimino del array ese valor
}
}
$updateSQL = "UPDATE tu_tabla SET campo_cedula = '".$array."' WHERE id = '".$id]."'";
}//fin del while

//con count($array) puedes tambien eliminar directamente los registros que superen las 6 unidades, ya adapta esto a tu caso
?>
__________________
-----------------------------------
Éxitos !!! .. joao
  #3 (permalink)  
Antiguo 12/09/2009, 10:21
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

gracias por tu ayuida...

existe alguna forma de hacerlo solo en sql? ya que no tengo acceso a ningun servidor ni para programar en asp o php.. solo tengo acceso a la base de datos
y uso mysql 4.1
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #4 (permalink)  
Antiguo 12/09/2009, 10:26
 
Fecha de Ingreso: abril-2009
Ubicación: Miami
Mensajes: 182
Antigüedad: 14 años, 11 meses
Puntos: 8
Respuesta: depurar campos.

...ops ....

.. bueno, no se me ocurre ninguna solución en SQL puro, pero si podrías IMPORTAR tu base de datos ya que tienes acceso a ella, tenerla localmente y hacer tu depuración en tu computador con PHP, y luego volverla a subir .... pienso que vale la pena :D ... un salu2 !!!

Cita:
Iniciado por lexus Ver Mensaje
gracias por tu ayuida...

existe alguna forma de hacerlo solo en sql? ya que no tengo acceso a ningun servidor ni para programar en asp o php.. solo tengo acceso a la base de datos
y uso mysql 4.1
__________________
-----------------------------------
Éxitos !!! .. joao
  #5 (permalink)  
Antiguo 12/09/2009, 11:22
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

gracias por tu ayuda...
existe alguna forma en hacerlo solo con consultas ? asi sean varias updates?
alguien lo ha hecho o sabe como hacerlo?
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #6 (permalink)  
Antiguo 12/09/2009, 12:28
 
Fecha de Ingreso: abril-2009
Ubicación: Miami
Mensajes: 182
Antigüedad: 14 años, 11 meses
Puntos: 8
Sonrisa Respuesta: depurar campos.

lo de los campos vacíos si puedes hacerlos con una consulta DELETE cuando el campo sea nulo, pero las comparaciones de cadenas para ver si hay letras u otros caracteres, no se me ocurre nada ... en caso de que encuentres pues postea ... sería inetersante !!!

Cita:
Iniciado por lexus Ver Mensaje
gracias por tu ayuda...
existe alguna forma en hacerlo solo con consultas ? asi sean varias updates?
alguien lo ha hecho o sabe como hacerlo?
__________________
-----------------------------------
Éxitos !!! .. joao
  #7 (permalink)  
Antiguo 13/09/2009, 19:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: depurar campos.

Cita:
quiero que las cedulas que sean menores a 6 digitos, reemplazarlos por 0
Código sql:
Ver original
  1. UPDATE tabla SET campo=IF(LENGTH(campo) < 6,'0',campo);

Cita:
los campos vacios y/o nulos reemplazarlos por 0
Código sql:
Ver original
  1. UPDATE tabla SET campo='0' WHERE campo IS NULL;
  2. UPDATE tabla SET campo='0' WHERE campo='';

Cita:
quiero primero reemplazar cualquier caracter diferente a numero por nada.
es decir letras, simbolos, espacios, quitarlos para que queden solo numeros
Lo de los numeros, te recomiendo crees una funión en mysql que recorra una cadena y elimine los caracteres diferentes a numeros y los reemplace. Luego la utilizas en el update.
Si tienes problemas, me avisas. No tengo como probar nada en este momento.

Cita:
y por ultimo cambiare el tipo de campo de varchar a bigint. para ke de aqui en adelante solo sean numeros..
Código sql:
Ver original
  1. ALTER TABLE tabla MODIFY campo BIGINT;

cabe aclarar que para hacer esto, no deben existir caracteres en el campo para que se haga correctamente.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 14/09/2009, 06:32
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

muchas gracias por la colaboracion..
la verdad no sabria como ahcer una funcion en mysql uso la version 4.1
no existe alguna forma de hacer una expresion regular o algo para ke solo deje numeros?
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #9 (permalink)  
Antiguo 14/09/2009, 06:57
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: depurar campos.

lexus...
La función habría que hacerla pero es un poco compleja. La idea es recoger mendiante la función el valor del campo. Con las funciones left o substring recorrer carácter por carácter hasta el length del campo y preguntar si es numérico o no.

Si no es numérico, que haga un replace del carácter encontrado por un espacio '', sino, que deje el numero tal cual.
Por lo que veo, tu manejas cantidades de datos muy grandes y la función puede tardar un tiempo considerable, pero solo es requerido hacerlo una sola vez, ya que después de esto, todos los teléfonos serán numéricos y no tendrás mas problemas.

Esa es la idea de como construir la función. Pero hacerla es un poco complicado y requiere de tiempo. Por el lado de expresiones regulares, no he encontrado nada, pero regexp es mas para efectos de comparación que de conversión.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 14/09/2009, 07:16
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

y si hago algo muy rudimentario como por decir un replace por cada letra del abecedario
y un replace por cada simbolo? igual los simbolos ke veo son pocos.. son solo _ -*?+ y cosas asi.
podria hacer mas o menos 30 o 40 updates.. depronto podria ser mas rapido? es algo arcaigo pero podria funcionar.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #11 (permalink)  
Antiguo 14/09/2009, 07:20
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: depurar campos.

claro lexus....

Esto es un trabajo que solo requieres hacer una vez en tu base de datos. Si funcionaría.

La ventaja de tener la función, es cuando te pidan un requerimiento similar y te toque hacerlo manual nuevamente.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 14/09/2009, 07:26
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

ok muchas gacias lo hare asi por ahora..
igual si es asi solo lo debo hacer una vez y ya. tonces me tomare el tiempo para meter el abecedario y todos los demas caracteres ke mas pueda..
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #13 (permalink)  
Antiguo 14/09/2009, 07:32
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

UNA PREGUNTA
ya tengo los replace en mayusculas hay alguna forma de en ese mismo replace hacerlo para ke tome tanto minuscula como mayuscula? o tengo ke repetirlo para cada caso?

UPDATE contactos SET cedula= REPLACE(cedula,'A','');
UPDATE contactos SET cedula= REPLACE(cedula,'a','');
UPDATE contactos SET cedula= REPLACE(cedula,'B','');
UPDATE contactos SET cedula= REPLACE(cedula,'b','');
UPDATE contactos SET cedula= REPLACE(cedula,'C','');
UPDATE contactos SET cedula= REPLACE(cedula,'D','');
UPDATE contactos SET cedula= REPLACE(cedula,'E','');
UPDATE contactos SET cedula= REPLACE(cedula,'F','');
UPDATE contactos SET cedula= REPLACE(cedula,'F','');
UPDATE contactos SET cedula= REPLACE(cedula,'H','');
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #14 (permalink)  
Antiguo 14/09/2009, 08:29
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: depurar campos.

Creo que toca hacerlo manual.
parece que para efectos de actualización, el collate no lo respeta mucho.

Pensé que si se utilizaba una codificación ci (case insensitive) con solo modificar una mayúscula o minúscula, servia cualquiera. Pero ante una pequeña prueba no camina.

Código mysql:
Ver original
  1. mysql> select campo2 from tabla_1;
  2. +--------+
  3. | campo2 |
  4. +--------+
  5. | Dd1    |
  6. +--------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> update tabla_1 set campo2=replace(campo2 collate latin1_spanish_ci,'D','');
  10. Query OK, 1 row affected (0.00 sec)
  11. Rows matched: 1  Changed: 1  Warnings: 0
  12.  
  13. mysql> select campo2 from tabla_1;
  14. +--------+
  15. | campo2 |
  16. +--------+
  17. | d1     |
  18. +--------+
  19. 1 row in set (0.00 sec)






Puedo estar equivocado.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #15 (permalink)  
Antiguo 14/09/2009, 08:38
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

lo hare manual por ahora.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #16 (permalink)  
Antiguo 14/09/2009, 08:40
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

y existe algun update ke me convierta una cadena en mayusculas?

123abcd456 en 123ABCD456

para asi luego correr la otra y solo reemplazar mayusculas?
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #17 (permalink)  
Antiguo 14/09/2009, 09:31
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: depurar campos.

Código sql:
Ver original
  1. UPDATE tabla SET campo=UPPER(campo);

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #18 (permalink)  
Antiguo 14/09/2009, 09:32
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 2 meses
Puntos: 4
Respuesta: depurar campos.

gracias ahora si ya quedo mejor.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:37.