Tengo una tabla, deseo eliminar todas las expresiones que no estén en una lista

Iniciado por Cergath, 5 Febrero 2015, 23:34 PM

0 Miembros y 1 Visitante están viendo este tema.

Cergath

Hola,

Como dice el asunto, tengo una lista, está de esta manera:

1) Nombre común, inf1, inf2, ciudad, departamento, país.
.....

A simple vista puede parecer un CSV, y en efecto funciona como tal, sin embargo no fue creado 'con ese propósito' porque la información está mezclada, y a veces, hay más comas, es un completo desorden.

por ejemplo:
1) Nombre común, inf2, inf1, inf3, ciudad, departamento, país.
2) Nombre común, inf1, inf2, ciudad, inf3, departamento, país.
3) Nombre común, ciudad, inf3, departamento, país.
.....

Y así por el estilo, no sigue un patrón, lo que hace que al importar, queden campos huérfanos, columnas de más, en fin, terrible.

Necesito extraer dos datos, lo que correspondería a Ciudad y Departamento, pero conservando su posición en la lista, por ejemplo, si 'Madrid' es la ciudad del registro número 2), entonces necesito que en la lista que se extraiga, Madrid, corresponda al número 2). ¿Me hago entender?.

Evidentemente necesitaré una lista de las expresiones comunes, es decir, una lista de todas las ciudades, y departamentos, etcétera, para que el programa pueda 'reconocer' qué extraer... La cuestión es, aunque tengo la 'estructura lógica' de lo que quiero.. ¿cómo lo hago?... son más de 50mil registros como para hacerlo manual... Estaré buscando opciones, por ahora dejo el tema para algún buen samaritano, muchas gracias por cualquier sugerencia.

Eleкtro

Cita de: Cergath en  5 Febrero 2015, 23:34 PMEvidentemente necesitaré una lista de las expresiones comunes, es decir, una lista de todas las ciudades, y departamentos, etcétera, para que el programa pueda 'reconocer' qué extraer... La cuestión es, aunque tengo la 'estructura lógica' de lo que quiero.. ¿cómo lo hago?...

Evidentemente si la ciudad puede estar en el campo 3 o en el 4 o 5 como en esas mismas posiciones pude estar el campo de un departamento, entonces también necesitaras evaluar y seleccionar los campos de ciudades de manera manual para generar esa lista de ciudades que luego ya sí podrás utilizar de manuera automatizada para seleccionar las ciudades de las listas originales.

Yo me imagino esta tarea dividida en tres partes bastante laboriosas:
Primera parte, coger una de las listas originales, y descartar de forma automatizada los campos dado un set de reglas/condiciones, generando una lista temporal con los campos descartados.

Segunda parte, de forma manual copiar todas las ciudades de la lista temporal, a una tercera lista llamada Ciudades.txt, y hacer lo mismo con los departamentos y una lista llamada Departamentos.txt. con una ciudad/departamento por cada linea.

Tercera Parte, Usar la metodología de la primera parte con la siguiente lista original (hacerlo con las 100 o 1.000 primeras listas), pero esta vez combinando el uso de las listas Ciudades.txt y Departamentos.txt para el filtrado automatizado, con esto descartarás campos innecesarios y ciudades/departamentos que ya hayas registrado en las listas Ciudades.txt y Departamentos.txt.
Seguir la metodología de la "segunda parte" para añadir nuevas ciudades y departamentos hasta considerarlas suficientes.

Una vez tengas una lista de Ciudades.txt y Departamentos.txt con con una cantidad suficiente para intentar procesar de forma automatizada los 50.000 archivos, hacerlo y registrar errores (registrar la linea en cuestión) en caso de que una linea no contenga ninguna ciudad/departamento registrada en las listas Ciudades.txt y Departamentos.txt. Para poder añadir la nueva ciudad/departamento y empezar de nuevo, hasta que la verificación de ciudades/departamentos en todas las lineas de los 50k de archivos haya tenido éxito, es decir, ya hayas podido asociar cada linea a ua ciudad/departamento.

Vaya una labor tienes por delante...

Para empezar a generar esas listas de ciudades.txt y departamentos.txt puedes servirte de bases de datos online:
http://www.geodatasource.com/world-cities-database/free (esta tabla es facil de parsear)
http://en.wikipedia.org/wiki/Lists_of_cities_by_country
http://www.travelgis.com/world/capitals.asp
http://lmgtfy.com/?q=cities+list




Solo se me ocurre que para la selección de los campos/ciudades para generar esa lista de campos/ciudades puedes ayudarte con la ayuda de descartes,
me refiero a generar el mismo archivo pero descartando campos que empiecen que cumplan ciertas reglas, por ejemplo comprobar si un campo empieza con dígitos (teléfonos, códigos postales) o que sigan otro set de reglas que tu ya conozcas y quieres implementar en el filtrado, para generar una lista más reducida que te ayude a seleccionar las ciudades de manera manual.
Sin duda alguna eso ayudaría a aumentar el tiempo de lectura de los campos de forma manual.

Por lo que especificas, "nombre común" siempre aparece como el primer elemento de la lista, suponiendo que eso sea así, el primer campo ya puedes descartado.

Pseudo-código:

sourceFile  = "lista1.csv"
destinyFile = "nueva lista1.csv"
lines       = []
fields      = []
tmpfields   = []
rule1Regex  = "^\d.+"
rule1Regex  = "\d.+$"
rule3Regex  = ...

# Generar la lista de lineas.
For each line in (read sourceFile) Do
lines.Add(line)
End For

# Iterar los elementos de la lista de lineas
For each line in lines Do

   # Partir la linea en campos,
   # utilizando como delimitador el caracter ",".
fields    = line.Split(",")
tmpfields = []

# Iterar los campos.
For each field in fields Do

# si el campo es numerico... descartar campo.
if field.trim Is numeric then

# si el primer caracter del campo es un número... descartar campo.
elseif field.trim[0] Is numeric then

# si el regex nº1 encuentra coincidencias en el campo... descartar campo.
elseif rule1Regex.Match(field.trim) then

# si el regex nº2 encuentra coincidencias en el campo... descartar campo.
elseif rule2Regex.Match(field.trim) then

elseif otras reglas... descartar campo.

Else
# Agregar el campo que no ha cumplido ninguna condición de descarte
# a la lista temporal de campos.
tmpfields.Add(field.trim)

End if

End For

# Escribir en la lista de destino, la lista de campos temporal que no contiene los campos descartados.
detinyFile.Append(tmpfields.Join(","))

End For


Saludos








lnvisible

¿Todas las líneas tienen una ciudad y un departamento?

¿La ciudad y el departamento van siempre entre comas?

¿Tienes listas de ciudades y departamentos o las puedes conseguir?

¿Podrías publicar la tabla? Creo que sería interesante como ejercicio.