Fractionnement du texte d'un champ de chaîne avant chaque délimiteur vers de nouveaux champs

9

J'essaie d'extraire des données de texte d'un champ de chaîne contenant du texte délimité par des points et de le placer dans de nouveaux champs à l'aide de la calculatrice de champ.

J'utilise cette fonction python ( extrait de Comment extraire du texte avant un / dans QGIS? ):

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

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

Cela renvoie tout le texte avant le premier point. Maintenant, je me demande comment écrire la fonction pour qu'elle place chaque ligne de texte délimitée dans un champ séparé.

Avant:

les tables

Après:

les tables

JWes
la source

Réponses:

10

EDIT : J'ai édité la réponse en fonction de certains commentaires de JWes .


Vous pouvez exécuter un script simple à partir de la console Python . Tout d'abord, ouvrez la console Python à partir de Plugins> Python Consoleet activez le bouton pour Editor:

entrez la description de l'image ici

Ensuite, chargez l'objet (un vecteur, une table, etc.) où vos données sont stockées.

Une fois cela fait, copiez le code suivant dans le 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()

puis exécutez-le:

entrez la description de l'image ici

Vous obtiendrez ceci:

entrez la description de l'image ici

Si vous préférez, vous pouvez évidemment utiliser le code ci-dessus comme une fonction Python pour la calculatrice de champ (j'ai vu que vous savez déjà comment le faire).

mgri
la source
J'obtiens le message d'erreur: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Traceback (dernier appel le plus récent): Fichier "<input> ", ligne 1, dans le fichier <module>" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", ligne 6, dans <module> feat [" Atg2 "] = champs [2] IndexError : index de liste hors plage
JWes
1
Cela se produit car vous avez probablement des chaînes différentes de l'exemple que vous avez fourni. L'erreur signifie qu'aucune valeur n'est stockée à la position n ° 2 de la liste fields. Ai-je raison?
mgri
Oui, vous avez raison, certaines fonctionnalités ont plus d'informations délimitées par plus de points que d'autres fonctionnalités.
JWes
1
Si vous pouvez fournir un exemple de fichier minimum (où je peux voir comment vos données sont structurées), je devrais être en mesure d'adapter le code à votre cas. Sinon, il devrait être nécessaire de recourir à des conditions par vous-même car il y a trop de possibilités à gérer sans directive.
mgri
Je mettrai alors à jour la question d'origine avec plus de détails sur la structure des données!
JWes
6

Ce n'est pas une méthode très efficace mais c'est celle que j'ai utilisée auparavant. Assurez-vous Field2et Field3existez, puis utilisez quelque chose comme ceci:

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

Exemple :

  1. Voici un attribut:

    Table d'attributs

  2. Ensuite, une fois votre script enregistré, sélectionnez pour mettre à jour Field1et utiliser l'expression:

    func("Field1")

    Editeur de fonctions

  3. Résultat:

    Résultat

Joseph
la source
1
Nous avons eu la même idée! =)
mgri
1
@HowToInQGIS - En effet, même si je préfère de loin votre méthode car elle est beaucoup plus facile :)
Joseph