Her sınırlayıcıdan önce bir dize alanından yeni alanlara metin bölme


9

Noktalarla ayrılmış metin içeren bir dize alanından metin verileri ayıklamak ve alan hesap makinesini kullanarak yeni alanlara yerleştirmek çalışıyorum.

Im bu python işlevini kullanarak ( QGIS önce / içinde metin ayıklamak nasıl alınır? ):

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

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

Bu, tüm metni ilk noktadan önce döndürür. Şimdi, ayrılmış her metin satırını ayrı bir alana yerleştirmek için işlevi nasıl yazacağımı merak ediyorum.

Önce:

Tablolar

Sonra:

Tablolar

Yanıtlar:


10

EDIT : Cevabı JWes tarafından yapılan bazı yorumlara göre düzenledim .


Python Konsolu'ndan basit bir komut dosyası çalıştırabilirsiniz . İlk olarak, Plugins> Python Konsolu'nu açın Python Consoleve aşağıdakiler için düğmeyi etkinleştirin Editor:

resim açıklamasını buraya girin

Ardından, verilerinizin depolandığı nesneyi (vektör, tablo vb.) Yükleyin.

Bunu yaptıktan sonra aşağıdaki kodu kopyalayın 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()

ve sonra çalıştırın:

resim açıklamasını buraya girin

Bunu elde edeceksiniz:

resim açıklamasını buraya girin

İsterseniz, alan hesaplayıcısı için yukarıdaki kodu bir Python işlevi olarak kullanabilirsiniz (bunu nasıl yapacağınızı zaten bildiğinizi gördüm).


Hata mesajını alıyorum: execfile (u'c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py'.encode ('mbcs')) Geri izleme (en son çağrı son): Dosya "<input> ", <module> Dosyasındaki satır 1" c: /users/jonwes~1/appdata/local/temp/tmpt2lphm.py ", satır 6, <module> feat [" Atg2 "] = fields [2] IndexError : liste endeksi aralık dışında
JWes

1
Bunun nedeni, sağladığınız örnekten farklı bazı dizeleriniz olması olabilir. Hata, listenin No.2 konumunda kayıtlı bir değer olmadığı anlamına gelir fields. Haklı mıyım?
mgri

Evet haklısınız, temelde bazı özellikler diğer özelliklerden daha fazla nokta ile sınırlandırılmış daha fazla bilgiye sahiptir.
JWes

1
Minimum örnek dosya sağlayabilirseniz (verilerinizin nasıl yapılandırıldığını görebilirim), kodu davanıza uyarlayabilmeliyim. Aksi takdirde, koşullara kendi başınıza tekrarlamak gerekir, çünkü bir kılavuz olmadan yönetmek için çok fazla olasılık vardır.
mgri

O zaman orijinal soruyu veri yapısı hakkında daha ayrıntılı olarak güncelleyeceğim!
JWes

6

Bu çok verimli bir yöntem değil, daha önce kullandığım bir yöntem. Var olduğundan emin olun Field2ve Field3sonra aşağıdakine benzer bir şey kullanın:

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

Örnek :

  1. İşte bir özellik:

    Özellik tablosu

  2. Ardından komut dosyanız kaydedildikten sonra Field1, ifadeyi güncellemek ve kullanmak için seçin :

    func("Field1")

    İşlev düzenleyici

  3. Sonuç:

    Sonuç


1
Aynı fikrimiz vardı! =)
mgri

1
@HowToInQGIS - Aslında yönteminizi çok daha kolay olduğu için tercih etmeme rağmen :)
Joseph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.