from gvsig import * from geom import * from commonsdialog import * from datetime import datetime def main(*args): """ 101: Duplicar columna con diferente tipo de dato: El objetivo es que teniendo una columna que sea de tipo texto (STRING) pero que contenga números o fechas, podamos transformala a una nueva columna de ese tipo nuevo de dato pero que tenga el mismo nombre que el campo inicial. Esto te obligará a crear una columna intermedia, etc. """ layer = currentLayer() schema = layer.getSchema() features = layer.features() atrib = schema.getAttrNames() #Mostramos por consola los campos y tipos del esquema activo for a in atrib: print a, schema.get(a).getDataTypeName() #consultamos qué campo queremos convertir while True: atribO = inputbox(u"Escribe:",u"Qué campo quieres transformar?",1) atribO = atribO.strip() atribO = atribO.upper() #nos aseguramos que el campo sea tipo STRING if atribO in str(schema.getAttrNames()).upper() and schema.get(atribO).getDataTypeName() == "String": break else: print msgbox(u"No has escrito un nombre de campo válido.") #CREAMOS UNA FUNCIÓN CUANDO QUEREMOS CAMPOS DE TIPO NÚMERO, DIRECTAMENTE CREAMOS TIPO FLOAT def creaNumero(): #creamos un nuevo campo temporal para transformar los datos schema = layer.getSchema() newSchema=createSchema(schema) newSchema.append("CAMPO_TEMP","FLOAT",size=30, precision=6) layer.edit() layer.updateSchema(newSchema) layer.commit() #copiamos los campos transformados en número tipo float for f in layer.features(): f.edit() f.set("CAMPO_TEMP", float(f.get(atribO))) layer.update(f) layer.commit() #eliminamos la columna antigua para eliminar el tipo y los datos schema = layer.getSchema() schema.modify() schema.remove(atribO) layer.edit() layer.updateSchema(schema) layer.commit() #añadimos de nuevo la columna con el tipo que nos interesa schema = layer.getSchema() newSchema=createSchema(schema) newSchema.append(atribO,"FLOAT",size=30, precision=6) layer.edit() layer.updateSchema(newSchema) layer.commit() #copiamos los datos de la columna temporal a la nueva con el mismo tipo for f in layer.features(): f.edit() f.set(atribO, f.CAMPO_TEMP) layer.update(f) layer.commit() #eliminamos la columna temporal schema = layer.getSchema() schema.modify() schema.remove("CAMPO_TEMP") layer.edit() layer.updateSchema(schema) layer.commit() #CREAMOS UNA FUNCIÓN CUANDO QUEREMOS CAMPOS DE TIPO FECHA def creaFecha(): #comprobamos que toda la columna de datos de fecha sea correcta según nuestros parámetros, sino dará error y saldrá de la aplicación def try_parsing_date(text): #solo aceptamos un tipo de formato de fecha, otros a valorar '%Y-%m-%d', '%d.%m.%Y', '%d/%m/%y', '%d-%m-%y' try: return datetime.strptime(text, '%Y%m%d') except ValueError: pass raise ValueError('El valor '+ "<" + text + ">" + " no es un tipo de fecha correcto.") for d in layer.features(): try_parsing_date(d.get(atribO)) #creamos un nuevo campo temporal para transformar los datos schema = layer.getSchema() newSchema=createSchema(schema) newSchema.append("CAMPO_TEMP","DATE") layer.edit() layer.updateSchema(newSchema) layer.commit() #copiamos los campos transformados en fecha for f in layer.features(): f.edit() f.set("CAMPO_TEMP", datetime.strptime(f.get(atribO),"%Y%m%d")) layer.update(f) layer.commit() #eliminamos la columna antigua para eliminar el tipo y los datos schema = layer.getSchema() schema.modify() schema.remove(atribO) layer.edit() layer.updateSchema(schema) layer.commit() #añadimos de nuevo la columna con el tipo que nos interesa schema = layer.getSchema() newSchema=createSchema(schema) newSchema.append(atribO,"DATE") layer.edit() layer.updateSchema(newSchema) layer.commit() #copiamos los datos de la columna temporal a la nueva con el mismo tipo for f in layer.features(): f.edit() f.set(atribO, f.CAMPO_TEMP) layer.update(f) layer.commit() #eliminamos la columna temporal schema = layer.getSchema() schema.modify() schema.remove("CAMPO_TEMP") layer.edit() layer.updateSchema(schema) layer.commit() #consultamos a qué tipo queremos transformar la nueva columna while True: tipoNuevo = inputbox(u"Escribe (N) o (F):", u"Qué tipo quieres, Número (N) o Fecha (F)?") tipoNuevo = tipoNuevo.upper() if "N" in tipoNuevo and "F" not in tipoNuevo: print "Número" creaNumero() break elif "F" in tipoNuevo and "N" not in tipoNuevo: print "Fecha" creaFecha() break else: msgbox("Vuelve a intentarlo.")