9 votos

Dividir el texto de un campo de cadena antes de cada delimitador en nuevos campos

Estoy intentando extraer datos de texto de un campo de cadena que contiene texto delimitado por puntos y colocarlo en nuevos campos utilizando la calculadora de campos.

Estoy usando esta función de python (tomada de ¿Cómo extraer el texto antes de un / en QGIS? ):

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def func(value1, feature, parent):
    return value1.split('.')[0]

Esto devuelve todo el texto antes del primer punto. Ahora me pregunto cómo escribir la función para que coloque cada fila de texto delimitado en un campo separado.

Antes:

Tables

Después:

Tables

10voto

Geoffrey Puntos 228

EDITAR : He editado la respuesta de acuerdo con algunos comentarios de JWes .


Puede ejecutar un simple script desde el Consola Python . En primer lugar, abra la consola de Python desde Plugins > Python Console y activar el botón para el Editor :

enter image description here

A continuación, cargue el objeto (un vector, una tabla, etc.) donde se almacenan sus datos.

Una vez hecho esto, copie el siguiente código en el archivo Editor :

layer = iface.activeLayer()
fieldindex = layer.fieldNameIndex("Tasks")
layer.startEditing()
for feat in layer.getFeatures():
    if feat[fieldindex]:
        fields = feat[fieldindex].split('.')
        for i in range(1, len(fields)):
            feat[fieldindex + i] = fields[i - 1]
            layer.updateFeature(feat)
    else:
        continue
layer.commitChanges()

y luego ejecutarlo:

enter image description here

Lo obtendrás:

enter image description here

Si lo prefieres, obviamente puedes utilizar el código anterior como una función de Python para la calculadora de campos (he visto que ya sabes cómo hacerlo).

0 votos

Obtengo el mensaje de error: execfile(u'c:/users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode('mbcs')) Traceback (most recent call last): File "<input>", line 1, in <module> File "c:/users/jonwes~1/appdata/local/temp/tmpt2lphm.py", line 6, in <module> feat["Atg2"] = fields[2] IndexError: list index out of range

1 votos

Esto sucede porque probablemente tienes algunas cadenas que son diferentes de la muestra que has proporcionado. El error significa que no hay un valor almacenado en la posición nº 2 de la lista fields . ¿Estoy en lo cierto?

0 votos

Sí, tienes razón, básicamente algunas características tienen más información delimitada por más puntos que otras.

6voto

Mue Puntos 2469

Este no es un método muy eficiente, pero es uno que he utilizado antes. Asegúrese de que Field2 y Field3 existe entonces usar algo como lo siguiente:

from qgis.core import *
from qgis.gui import *
import re

@qgsfunction(args='auto', group='Custom')
def func(field, feature, parent):
    # Get active layer
    layer = qgis.utils.iface.activeLayer()
    # Get field indices
    idx_2 = layer.fieldNameIndex('Field2')
    idx_3 = layer.fieldNameIndex('Field3')
    # Extract string values
    first_value = [w for w in re.split('\W', field) if w][0]
    second_value = [w for w in re.split('\W', field) if w][1]
    third_value = [w for w in re.split('\W', field) if w][2]    
    # Update values in fields
    layer.changeAttributeValue(feature.id(), idx_2, second_value)
    layer.changeAttributeValue(feature.id(), idx_3, third_value)
    return first_value

Ejemplo :

  1. Aquí hay un atributo:

    Attribute table

  2. Entonces, una vez que su script haya sido guardado, seleccione actualizar Field1 y utilizar la expresión

    func("Field1")

    Function editor

  3. Resultado:

    Result

1 votos

¡Tenemos la misma idea! =)

1 votos

@HowToInQGIS - Efectivamente, aunque prefiero tu método porque es mucho más fácil :)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X