将文本从每个分隔符之前的字符串字段拆分为新字段


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]

这将返回第一个点之前的所有文本。现在,我想知道如何编写该函数以将每个分隔的文本行放在单独的字段中。

之前:

桌子

后:

桌子

Answers:


10

编辑:我根据JWes的一些评论编辑了答案。


您可以从Python控制台运行一个简单的脚本。首先,从Plugins> 打开Python控制台,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'))追溯(最近一次调用最近):文件“ <input> “,<模块>文件中的第1行,” c:/users/jonwes~1/appdata/local/temp/tmpt2lphm.py“,<模块>中的第6行,feat [” Atg2“] =字段[2] IndexError :列表索引超出范围
JWes

1
发生这种情况是因为您可能有一些与您提供的示例不同的字符串。错误表示列表的第2位没有存储值fields。我对吗?
mgri

是的,您是对的,基本上,某些功能比其他功能具有更多由点分隔的信息。
JWes

1
如果您可以提供一个最小的样本文件(在这里我可以看到您的数据的结构),那么我应该能够使代码适合您的情况。否则,应该有必要自己重提条件,因为如果没有指南,就有太多的可能性要管理。
mgri

然后,我将在数据结构上更详细地更新原始问题!
JWes

6

这不是一种非常有效的方法,而是我之前使用过的方法。确保Field2Field3存在,那么使用类似如下:

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
我们有相同的想法!=)
mgri

1
@HowToInQGIS-确实,尽管我更喜欢您的方法,因为它更容易:)
Joseph
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.