Разделение текста из строкового поля перед каждым разделителем на новые поля


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

РЕДАКТИРОВАТЬ : Я отредактировал ответ в соответствии с некоторыми комментариями 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, в <файле> файла" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", строка 6, в <модуле> feat [" Atg2 "] = fields [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.