Розщеплення тексту від рядкового поля перед кожним роздільником на нові поля


9

Я намагаюся витягнути текстові дані з рядкового поля, що містить текст, розділений крапками, і розмістити їх у нових полях за допомогою калькулятора поля.

Я використовую цю функцію python (Взятий із способу вилучення тексту до / у QGIS? ):

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

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

Це повертає весь текст перед першою крапкою. Тепер мені цікаво, як написати для нього функцію, щоб розмістити кожен розділений текстовий рядок в окремому полі.

Перед:

Столи

Після:

Столи

Відповіді:


10

EDIT : Відповідь я відредагував згідно з деякими коментарями JWes .


Ви можете запустити простий скрипт із консолі Python . По-перше, відкрийте консоль Python від Plugins> Python Consoleта активуйте кнопку для Editor:

введіть тут опис зображення

Потім завантажте об’єкт (вектор, таблицю тощо), де зберігаються ваші дані.

Після цього скопіюйте такий код у 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()

а потім запустіть його:

введіть тут опис зображення

Ви отримаєте це:

введіть тут опис зображення

Якщо ви віддаєте перевагу, ви, очевидно, можете використовувати вищевказаний код як функцію Python для польового калькулятора (я бачив, що ви вже знаєте, як це зробити).


Я отримую повідомлення про помилку: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Traceback (останній дзвінок останній): Файл "<input> ", рядок 1, у <module> Файл" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", рядок 6, у <module> feat [" Atg2 "] = поля [2] IndexError : список покажчиків поза діапазоном
JWes

1
Це відбувається тому, що у вас, ймовірно, є рядки, які відрізняються від наданого вами зразка. Помилка означає, що у позиції №2 списку немає значення, яке зберігається fields. Чи правий я?
мгрі

Так, ви маєте рацію, в основному деякі функції мають більше інформації, розмежованої на більше точок, ніж інші функції.
JWes

1
Якщо ви можете надати мінімальний зразок файлу (де я бачу, як ваші дані структуровані), я маю змогу адаптувати код до вашої справи. В іншому випадку слід повторювати умовні умови самостійно, оскільки занадто багато можливостей для управління без керівництва.
мгрі

Тоді я оновлю оригінальне запитання з більш детальною інформацією про структуру даних!
JWes

6

Це не дуже ефективний метод, але це той, який я використовував раніше. Переконайтеся в тому , Field2і Field3існують , то використовувати що - щось подібне до наступного:

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

Приклад :

  1. Ось атрибут:

    Таблиця атрибутів

  2. Після того, як ваш сценарій буде збережено, виберіть оновлення Field1та використання виразу:

    func("Field1")

    Функція редактор

  3. Результат:

    Результат


1
У нас була така ж ідея! =)
мгрі

1
@HowToInQGIS - Дійсно, хоча я більше віддаю перевагу вашому методу, оскільки це набагато простіше :)
Йосип
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.