Teilen von Text aus einem Zeichenfolgenfeld vor jedem Trennzeichen in neue Felder

9

Ich versuche, Textdaten aus einem Zeichenfolgenfeld zu extrahieren, das durch Punkte begrenzten Text enthält, und sie mit dem Feldrechner in neue Felder einzufügen.

Ich benutze diese Python-Funktion (entnommen aus Wie extrahiere ich Text vor einem / in QGIS? ):

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

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

Dies gibt den gesamten Text vor dem ersten Punkt zurück. Jetzt frage ich mich, wie ich die Funktion schreiben soll, damit jede begrenzte Textzeile in einem separaten Feld platziert wird.

Vor:

Tabellen

Nach dem:

Tabellen

Zeugen Jehovas
quelle

Antworten:

10

EDIT : Ich habe die Antwort gemäß einigen Kommentaren von JWes bearbeitet .


Sie können ein einfaches Skript über die Python-Konsole ausführen . Öffnen Sie zunächst die Python-Konsole von Plugins> Python Consoleund aktivieren Sie die Schaltfläche für Editor:

Geben Sie hier die Bildbeschreibung ein

Laden Sie dann das Objekt (einen Vektor, eine Tabelle usw.), in dem Ihre Daten gespeichert sind.

Kopieren Sie anschließend den folgenden Code in 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()

und dann ausführen:

Geben Sie hier die Bildbeschreibung ein

Sie erhalten dies:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie es vorziehen, können Sie den obigen Code natürlich als Python-Funktion für den Feldrechner verwenden (ich habe gesehen, dass Sie bereits wissen, wie es geht).

mgri
quelle
Ich erhalte die Fehlermeldung: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Traceback (letzter Aufruf zuletzt): Datei "<input> ", Zeile 1, in <module> -Datei" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", Zeile 6, in <module> feat [" Atg2 "] = fields [2] IndexError : Liste Index außerhalb des Bereichs
JWes
1
Dies liegt daran, dass Sie wahrscheinlich einige Zeichenfolgen haben, die sich von dem von Ihnen bereitgestellten Beispiel unterscheiden. Der Fehler bedeutet, dass an Position 2 der Liste kein Wert gespeichert ist fields. Habe ich recht?
Mgri
Ja, Sie haben Recht, im Grunde haben einige Funktionen mehr Informationen, die durch mehr Punkte begrenzt sind als andere Funktionen.
JWes
1
Wenn Sie eine Mindestbeispieldatei bereitstellen können (in der ich sehen kann, wie Ihre Daten strukturiert sind), sollte ich den Code an Ihren Fall anpassen können. Andernfalls sollte es notwendig sein, die Bedingungen selbst zu wiederholen, da es zu viele Möglichkeiten gibt, ohne eine Richtlinie auszukommen.
Mgri
Ich werde dann die ursprüngliche Frage mit mehr Details zur Datenstruktur aktualisieren!
JWes
6

Dies ist keine sehr effiziente Methode, aber eine, die ich zuvor verwendet habe. Stellen Sie sicher, dass es existiert , Field2und verwenden Sie Field3dann Folgendes:

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

Beispiel :

  1. Hier ist ein Attribut:

    Attributtabelle

  2. Wählen Sie dann nach dem Speichern Ihres Skripts die Option zum Aktualisieren Field1und verwenden Sie den folgenden Ausdruck:

    func("Field1")

    Funktionseditor

  3. Ergebnis:

    Ergebnis

Joseph
quelle
1
Wir hatten die gleiche Idee! =)
Mgri
1
@ HowToInQGIS - In der Tat, obwohl ich Ihre Methode sehr bevorzuge, da es viel einfacher ist :)
Joseph