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

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).


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.