import gvsig import commonsdialog import geom import re def main(): processFromShape() #processFromFile() def processFromShape(): #Obtiene la capa activa layer = currentLayer() #Pregunta el campo a procesar campo = commosdialog.inputbox(u'Introduzca el nombre del campo del código', commosdialog.QUESTION ) #Comprueba que el campo existe if campo in ("", None) or not layer.getSchema().get(campo, None): msgbox("El campo introducido no es válido", "Aviso", WARNING) return #Crea un nuevo shape output = createLayer() #Obtiene los fenomenos de la capa activa features = layer.features() #Para cada fenomeno for feature in features: #Obtiene el valor del campo linea = feature.get(campo) #Busca si hay un '(' if linea.find("(") !=-1: #Encuentra un parentesis busca 3 primeras mayusculas despues del '(' r = findFirst(linea) else: #No lo encunetra guarda la linea r = linea #Obtiene los valores del fenomeno values = feature.getValues() #guarda el codigo obtenido values["CODIGO_SIOSE"] = r #anyade los valores a la nueva capa output.append(values) #libera los fenomenos features.dispose() #termina la edicion de la capa nueva output.commit() def createLayer(): """ Crea un nuevo shape """ ruta = '/tmp/codigosSIOSE.shp' #donde se guarda el sshape CRS = currentProject().getProjectionCode() #proyeccion del shape schema = createSchema(currentLayer().getSchema()) #definicion de los datos #Anyade el campo 'CODIGO_SIOSE' a la dfinicion de datos schema.append("CODIGO_SIOSE", "STRING", size =10, default="") #crea la nueva capa output = createShape( schema, ruta, CRS=CRS, geometryType=geom.SURFACE ) return output def processFromFile(): """ Los codigos estan en un archivo de texto y solo imprime el resultado """ f = file("/tmp/codigos.txt", "r") #comprueba la ruta!!! #recorre las lineas del archivo for index, line in enumerate(f.readlines()): #Si encuentra un "(" busca las primeras mayusculas l = line if l.endswith('\n'): #Comprueba que el salto de linea l = line[:-1] # Si lo hay lo quita if l.find("(") !=-1: #Encuentra un parentesis r = findFirst(l) #procesa la linea en busca del codigo else: r = l print "%s, %s, %s"%(index,l,r) f.close() def findFirst(line): #Expresion regular 3 letras mayusculas patron = re.compile("[A-Z]{3}") s = "" #busca en la linea en que posicion esta "(" index = line.find("(") #Busca dentro de la cadena las 3 primeras mayusculas despues del "(" r=patron.search(line[index:]) #si se ha encontrado algo obtiene el resultado if r: s = r.string[r.start():r.end()] return s def findAll(line): patron = re.compile("[A-Z]{3}") index = 0 l = list() #busca dentro de la linea todos los "(" while (line.find("(", index, len(line)) !=-1): index = line.find("(", index, len(line)) +1 dd = line[index:] #busca las 3 primeras mayusculas en la cadena r=patron.search(dd) #si se ha encontrado algo imprime el resultado if r: print r.string[r.start():r.end()] l.append(r.string[r.start():r.end()]) return l if __name__ == "__main__": main()