Divisão de texto de um campo de sequência antes de cada delimitador para novos campos

9

Estou tentando extrair dados de texto de um campo de string contendo texto delimitado por pontos e colocando-o em novos campos usando a calculadora de campos.

Estou usando esta função python (Retirado de Como extrair texto antes de um / no QGIS? ):

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

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

Isso retorna todo o texto antes do primeiro ponto. Agora, estou pensando em como escrever a função para colocar cada linha de texto delimitada em um campo separado.

Antes:

Tabelas

Depois de:

Tabelas

JWes
fonte

Respostas:

10

Edição : Eu editei a resposta de acordo com alguns comentários de JWes .


Você pode executar um script simples no console do Python . Primeiramente, abra o Python Console em Plugins> Python Consolee ative o botão para Editor:

insira a descrição da imagem aqui

Em seguida, carregue o objeto (um vetor, uma tabela etc.) onde seus dados são armazenados.

Depois de fazer isso, copie o seguinte código no 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 execute-o:

insira a descrição da imagem aqui

Você obterá isso:

insira a descrição da imagem aqui

Se preferir, obviamente você pode usar o código acima como uma função Python para a calculadora de campo (vi que você já sabe como fazê-lo).

mgri
fonte
Recebo a mensagem de erro: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Traceback (última chamada mais recente): Arquivo "<input> ", linha 1, no arquivo <module>" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", linha 6, em <module> feat [" Atg2 "] = campos [2] IndexError : list index out of range
JWes 5/17
11
Isso acontece porque você provavelmente tem algumas seqüências diferentes da amostra que você forneceu. O erro significa que não há um valor armazenado na posição No.2 da lista fields. Estou certo?
MGRI
Sim, você está certo, basicamente alguns recursos têm mais informações delimitadas por mais pontos do que outros.
JWes
11
Se você puder fornecer um arquivo de amostra mínimo (onde eu possa ver como seus dados estão estruturados), eu posso adaptar o código ao seu caso. Caso contrário, deve ser necessário recorrer a condicionais por conta própria, porque há muitas possibilidades de gerenciamento sem uma diretriz.
MGRI
Vou atualizar a pergunta original com mais detalhes sobre a estrutura de dados!
JWes
6

Este não é um método muito eficiente, mas que eu usei antes. Certifique-se Field2e Field3existem em seguida, usar algo como o seguinte:

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

Exemplo :

  1. Aqui está um atributo:

    Tabela de Atributos

  2. Depois que seu script for salvo, selecione para atualizar Field1e use a expressão:

    func("Field1")

    Editor de funções

  3. Resultado:

    Resultado

Joseph
fonte
11
Tivemos a mesma ideia! =)
mgri
11
@HowToInQGIS - Na verdade, embora eu prefiro muito mais o seu método, pois é muito mais fácil :)
Joseph