Dividere il testo da un campo stringa prima di ogni delimitatore in nuovi campi


9

Sto cercando di estrarre i dati di testo da un campo stringa contenente testo delimitato da punti e posizionandolo in nuovi campi utilizzando il calcolatore di campo.

Sto usando questa funzione Python (Tratto da Come estrarre il testo prima di un / in QGIS? ):

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

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

Ciò restituisce tutto il testo prima del primo punto. Ora mi chiedo come scrivere la funzione per posizionare ogni riga di testo delimitata in un campo separato.

Prima:

tabelle

Dopo:

tabelle

Risposte:


10

EDIT : ho modificato la risposta in base ad alcuni commenti di JWes .


È possibile eseguire un semplice script dalla console Python . Innanzitutto, apri Python Console da Plugins> Python Consolee attiva il pulsante per Editor:

inserisci qui la descrizione dell'immagine

Quindi, carica l'oggetto (un vettore, una tabella, ecc.) In cui sono memorizzati i tuoi dati.

Una volta fatto questo, copia il seguente codice nel 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()

e quindi eseguirlo:

inserisci qui la descrizione dell'immagine

Otterrai questo:

inserisci qui la descrizione dell'immagine

Se preferisci, puoi ovviamente usare il codice sopra come funzione Python per il calcolatore di campo (ho visto che sai già come farlo).


Ricevo il messaggio di errore: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Traceback (ultima chiamata più recente): File "<input> ", riga 1, nel file <module>" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", riga 6, in <module> feat [" Atg2 "] = fields [2] IndexError : elenco degli indici fuori portata
JWes

1
Questo accade perché probabilmente hai alcune stringhe che sono diverse dal campione che hai fornito. L'errore indica che non è stato memorizzato alcun valore nella posizione n fields. 2 dell'elenco . Ho ragione?
mgri

Sì, hai ragione, in sostanza alcune funzionalità hanno più informazioni delimitate da più punti rispetto ad altre funzionalità.
JWes

1
Se riesci a fornire un file di esempio minimo (dove posso vedere come sono strutturati i tuoi dati), dovrei essere in grado di adattare il codice al tuo caso. Altrimenti, dovrebbe essere necessario ricorrere ai condizionali da soli perché ci sono troppe possibilità da gestire senza linee guida.
mgri

Aggiornerò quindi la domanda originale con maggiori dettagli sulla struttura dei dati!
JWes

6

Questo non è un metodo molto efficace ma è uno che ho usato prima. Assicurarsi Field2ed Field3esistere quindi utilizzare qualcosa di simile al seguente:

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

Esempio :

  1. Ecco un attributo:

    Tabella degli attributi

  2. Quindi, una volta salvato lo script, selezionare per aggiornare Field1e utilizzare l'espressione:

    func("Field1")

    Editor di funzioni

  3. Risultato:

    Risultato


1
Abbiamo avuto la stessa idea! =)
mgri

1
@HowToInQGIS - In effetti, anche se preferisco di gran lunga il tuo metodo in quanto è molto più semplice :)
Joseph
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.